Files
docker-rconfig/tests/Slowtests/ControllersTests/Console/Commands/rconfigTaskDownloadTest.php
2024-10-19 18:23:55 +00:00

416 lines
19 KiB
PHP

<?php
namespace Tests\Slowtests\ControllersTests\Console\Commands;
use App\CustomClasses\GetAndCheckCategoryIds;
use App\CustomClasses\GetAndCheckTagIds;
use App\CustomClasses\GetAndCheckTaskIds;
use App\Http\Controllers\Connections\Params\DeviceParams;
use App\Models\Device;
use App\Models\Taskdownloadreport;
use App\Models\User;
use App\Services\Config\FileOperations;
use Artisan;
use File;
use Tests\TestCase;
class rconfigTaskDownloadTest extends TestCase
{
protected $user;
protected $device;
protected $tags;
protected $device1_params_object;
public function setUp(): void
{
parent::setUp();
$this->device1 = Device::where('id', 1001)->first();
$this->device2 = Device::where('id', 1002)->first();
$this->device5 = Device::where('id', 1005)->first();
$this->device8 = Device::where('id', 1008)->first();
// tags and relationships with devices are seeded in DeviceTableSeeder class
$device1_params = new DeviceParams($this->device1->toArray());
$this->device1_params_object = $device1_params->getAllDeviceParams();
$this->user = User::factory()->create();
/** @var mixed $this->user */
$this->actingAs($this->user, 'api');
}
/** @test */
public function task_was_not_found()
{
Artisan::call('rconfig:download-task 2123123');
$result = Artisan::output();
$arr = explode("\n", $result);
$this->assertStringContainsString($arr[0], 'This operation can take some time, depending on how many devices are configured for this task!!!');
$this->assertStringContainsString($arr[1], 'Start rconfig:download-task IDs:2123123');
$this->assertStringContainsString($arr[2], 'No task records returned. Download will now terminate!');
}
/** @test */
public function the_task_was_found_and_routers_task_has_devices()
{
$taskrecords = (new GetAndCheckTaskIds([555555, 666666, 777777]))->GetTaskRecords(); // 555555 = DevTask1 & 666666 = DevTask2 which are seeded categories
$this->assertCount(3, $taskrecords);
$this->assertGreaterThan(0, $taskrecords[0]->device->count());
$this->assertGreaterThan(0, $taskrecords[1]->tag->count());
$this->assertGreaterThan(0, $taskrecords[2]->category->count());
}
/** @test */
public function the_test_task_5555555_has_two_devices()
{
$taskrecords = (new GetAndCheckTaskIds([555555, 666666, 777777]))->GetTaskRecords(); // 555555 = DevTask1 & 666666 = DevTask2 which are seeded categories
$this->assertCount(3, $taskrecords);
$this->assertCount(2, $taskrecords[0]->device);
}
/**
* @test
* @group slow-tests
*/
public function the_test_task_5555555_has_two_devices_and_can_download_both_of_them()
{
Artisan::call('rconfig:download-task 555555 -d');
$result = Artisan::output();
$arr = explode("\n", $result);
foreach ($arr as $line) {
preg_match('/"([^"]+)"/', $line, $match); // get the command from between the quotes in the returned output
if (!empty($match)) {
$this->assertTrue($this->downloaded_file_exists_on_disk($this->device2, $match[0]));
}
}
$this->assertGreaterThan(0, count($arr));
$this->assertStringContainsString($arr[0], 'This operation can take some time, depending on how many devices are configured for this task!!!');
$this->assertStringContainsString($arr[1], 'Start rconfig:download-task IDs:555555');
$this->assertStringContainsString($arr[2], 'Start device download for router1 ID:1001');
$this->assertStringContainsString($arr[3], 'Config downloaded for router1 with command: "show clock" was successful');
$this->assertStringContainsString($arr[4], 'Config downloaded for router1 with command: "show version" was successful');
$this->assertStringContainsString($arr[5], 'Config downloaded for router1 with command: "show run" was successful');
$this->assertStringContainsString($arr[6], 'Start device download for router2 ID:1002');
$this->assertStringContainsString($arr[7], 'Config downloaded for router2 with command: "show clock" was successful');
$this->assertDatabaseHas('devices', [
'id' => 1001,
'status' => 1,
]);
}
/** @test */
public function the_test_task_666666_has_one_tag()
{
$taskrecords = (new GetAndCheckTaskIds([555555, 666666, 777777]))->GetTaskRecords(); // 555555 = DevTask1 & 666666 = DevTask2 which are seeded categories
$this->assertCount(3, $taskrecords);
$this->assertCount(1, $taskrecords[1]->tag);
$tagrecords = (new GetAndCheckTagIds([1001, 1002, 1003]))->GetTagRecords();
}
/** @test */
public function the_test_task_666666_has_one_tag_and_the_tag_has_one_device()
{
$taskrecords = (new GetAndCheckTaskIds([555555, 666666, 777777]))->GetTaskRecords(); // 555555 = DevTask1 & 666666 = DevTask2 which are seeded categories
$this->assertCount(3, $taskrecords);
$this->assertCount(1, $taskrecords[1]->tag);
$tagrecords = (new GetAndCheckTagIds([$taskrecords[1]->tag[0]->id]))->GetTagRecords();
$this->assertCount(1, $tagrecords);
$this->assertCount(1, $tagrecords[0]->device);
}
/**
* @test
* @group slow-tests
*/
public function the_test_task_666666_has_one_devices_and_can_download_it()
{
Artisan::call('rconfig:download-task 666666 -d');
$result = Artisan::output();
$arr = explode("\n", $result);
foreach ($arr as $line) {
preg_match('/"([^"]+)"/', $line, $match); // get the command from between the quotes in the returned output
if (!empty($match)) {
$this->assertTrue($this->downloaded_file_exists_on_disk($this->device2, $match[0]));
}
}
$this->assertGreaterThan(0, count($arr));
$this->assertStringContainsString($arr[0], 'This operation can take some time, depending on how many devices are configured for this task!!!');
$this->assertStringContainsString($arr[1], 'Start rconfig:download-task IDs:666666');
$this->assertStringContainsString($arr[2], 'Start device download for router2 ID:1002');
$this->assertStringContainsString($arr[3], 'Config downloaded for router2 with command: "show clock" was successful');
$this->assertStringContainsString($arr[4], 'Config downloaded for router2 with command: "show version" was successful');
$this->assertStringContainsString($arr[5], 'Config downloaded for router2 with command: "show run" was successful');
$this->assertStringContainsString($arr[6], 'End rconfig:download-task');
$this->assertDatabaseHas('devices', [
'id' => 1001,
'status' => 1,
]);
}
/**
* @test
* @group slow-tests
*/
public function the_test_task_666666_has_one_devices_and_can_download_it_and_a_report_is_created()
{
// $this->markTestSkipped('Can only run this test manually - must be revisited.');
Artisan::call('rconfig:download-task 666666 -d');
$result = Artisan::output();
$arr = explode("\n", $result);
foreach ($arr as $line) {
preg_match('/"([^"]+)"/', $line, $match); // get the command from between the quotes in the returned output
if (!empty($match)) {
$this->assertTrue($this->downloaded_file_exists_on_disk($this->device2, $match[0]));
}
}
sleep(10); // just sleeping while job is run to generate the report and log the results in the DB
$task_report_record = Taskdownloadreport::where('task_id', 666666)->first();
// dd($task_report_record);
$this->assertGreaterThan(0, count($arr));
$this->assertStringContainsString($arr[0], 'This operation can take some time, depending on how many devices are configured for this task!!!');
$this->assertStringContainsString($arr[1], 'Start rconfig:download-task IDs:666666');
$this->assertStringContainsString($arr[2], 'Start device download for router2 ID:1002');
$this->assertStringContainsString($arr[3], 'Config downloaded for router2 with command: "show clock" was successful');
$this->assertStringContainsString($arr[4], 'Config downloaded for router2 with command: "show version" was successful');
$this->assertStringContainsString($arr[5], 'Config downloaded for router2 with command: "show run" was successful');
$this->assertStringContainsString($arr[6], 'End rconfig:download-task');
$this->assertDatabaseHas('devices', [
'id' => 1002,
'status' => 1,
]);
$this->assertDatabaseHas('configs', [
'device_id' => 1002,
'download_status' => 1,
'report_id' => $task_report_record->report_id,
'command' => 'show version',
]);
$this->assertDatabaseHas('taskdownloadreports', [
'task_id' => 666666,
'report_id' => $task_report_record->report_id,
'file_name' => $task_report_record->report_id . '.html',
]);
$filepath = report_path() . $task_report_record->report_id . '.html';
$this->assertTrue(File::exists($filepath));
// $this->assertStringContainsString('<h4><strong>Task ID/ Name:</strong> 666666 / DevTask2 </h4>\n', file_get_contents($filepath));
// $this->assertStringContainsString('<td><a href="/device/view/1002">router2</a></td>', file_get_contents($filepath));
File::delete($filepath);
}
/** @test */
public function the_test_task_7777777_has_three_categories()
{
$taskrecords = (new GetAndCheckTaskIds([555555, 666666, 777777]))->GetTaskRecords(); // 555555 = DevTask1 & 666666 = DevTask2 which are seeded categories
$this->assertCount(3, $taskrecords);
$this->assertCount(3, $taskrecords[2]->category);
}
/** @test */
public function the_test_task_7777777_has_three_categories_and_x_devices_per_category()
{
$taskrecords = (new GetAndCheckTaskIds([555555, 666666, 777777]))->GetTaskRecords(); // 555555 = DevTask1 & 666666 = DevTask2 which are seeded categories
$this->assertCount(3, $taskrecords);
$this->assertCount(3, $taskrecords[2]->category);
$categoryrecords = (new GetAndCheckCategoryIds($taskrecords[2]->category->pluck('id')->toArray()))->GetCategoryRecords(); // 1 = routers & 2 = switches which are seeded categories
$this->assertCount(3, $categoryrecords);
// $this->assertCount(1, $tagrecords[0]->device);
$this->assertGreaterThan(6, count($categoryrecords[0]->device));
$this->assertCount(0, $categoryrecords[1]->device);
$this->assertCount(0, $categoryrecords[2]->device);
}
/**
* @test
* @group slow-tests
*/
public function the_test_task_777777_has_four_devices_and_can_download_them()
{
Artisan::call('rconfig:download-task 777777 -d');
$result = Artisan::output();
$arr = explode("\n", $result);
foreach ($arr as $line) {
preg_match('/"([^"]+)"/', $line, $match); // get the command from between the quotes in the returned output
if (!empty($match)) {
$this->assertTrue($this->downloaded_file_exists_on_disk($this->device2, $match[0]));
}
}
$this->assertGreaterThan(0, count($arr));
$this->assertStringContainsString($arr[0], 'This operation can take some time, depending on how many devices are configured for this task!!!');
$this->assertStringContainsString($arr[1], 'Start rconfig:download-task IDs:777777');
$this->assertStringContainsString($arr[2], 'Start device download for router1 ID:1001');
$this->assertStringContainsString($arr[3], 'Config downloaded for router1 with command: "show clock" was successful');
$this->assertStringContainsString($arr[6], 'Start device download for router2 ID:1002');
$this->assertStringContainsString($arr[10], 'Start device download for router3 ID:1003');
$this->assertStringContainsString($arr[14], 'Start device download for router4 ID:1004');
$this->assertStringContainsString($arr[18], 'Start device download for router5 ID:1005');
$this->assertStringContainsString($arr[19], 'Start device download for router1v6 ID:1009');
$this->assertStringContainsString($arr[24], 'Config downloaded for router1v6 with command: "show run" was successful');
// $this->assertStringContainsString($arr[27], 'End rconfig:download-task');
$this->assertDatabaseHas('devices', [
'id' => 1001,
'status' => 1,
]);
$this->assertDatabaseHas('devices', [
'id' => 1009,
'status' => 1,
]);
}
/**
* @test
* @group slow-tests
*/
public function the_test_task_888888_has_one_device_and_cannot_download_and_sends_task_complete_notification_as_configured()
{
// test Task completion notification for given task
\Queue::fake();
// configure failure report only
\DB::table('tasks')->where('id', 888888)->update(['task_email_notify' => 1]);
$this->assertDatabaseHas('tasks', [
'id' => 888888,
'task_email_notify' => 1,
'download_report_notify' => 0,
'verbose_download_report_notify' => 0,
]);
Artisan::call('rconfig:download-task 888888 -d');
$result = Artisan::output();
// dd($result);
$arr = explode("\n", $result);
foreach ($arr as $line) {
preg_match('/"([^"]+)"/', $line, $match); // get the command from between the quotes in the returned output
if (!empty($match)) {
$this->assertTrue($this->downloaded_file_exists_on_disk($this->device2, $match[0]));
}
}
$this->assertGreaterThan(0, count($arr));
$this->assertStringContainsString($arr[0], 'This operation can take some time, depending on how many devices are configured for this task!!!');
$this->assertStringContainsString($arr[1], 'Start rconfig:download-task IDs:888888');
$this->assertStringContainsString($arr[2], 'Start device download for router8 ID:1008');
$this->assertStringContainsString($arr[3], 'No config data returned for router8 - ID:1008. Check your logs for more information');
$this->assertDatabaseHas('devices', [
'id' => 1008,
'status' => 0,
]);
$this->assertDatabaseHas('tasks', [
'id' => 888888,
'task_email_notify' => 1,
'download_report_notify' => 0,
'verbose_download_report_notify' => 0,
]);
// \Queue::assertPushed(\App\Jobs\TaskCompleteNotificationJob::class, 1);
$this->assertDatabaseHas('notifications', [
'notifiable_id' => 1,
'type' => 'App\Notifications\DBDeviceConnectionFailureNotification',
'data' => '{"title":"Device Connection Error","description":"No config data returned for router8 - ID:1008. Check your logs for more information","category":"downloader","error":"error","icon":"pficon-error-circle-o"}',
]);
$this->assertDatabaseHas('notifications', [
'notifiable_id' => 2,
'type' => 'App\Notifications\DBDeviceConnectionFailureNotification',
'data' => '{"title":"Device Connection Error","description":"Unable to connect to 10.0.0.111 - ID:1008","category":"downloader","error":"error","icon":"pficon-error-circle-o"}',
]);
}
/**
* @test
* @group slow-tests
*/
public function the_test_task_888888_has_one_device_and_cannot_download_and_send_failure_report_notify_as_configured()
{
\Queue::fake();
// configure failure report only
\DB::table('tasks')->where('id', 888888)->update(['download_report_notify' => 1]);
$this->assertDatabaseHas('tasks', [
'id' => 888888,
'task_email_notify' => 1,
'download_report_notify' => 1,
'verbose_download_report_notify' => 0,
]);
Artisan::call('rconfig:download-task 888888 -d');
$result = Artisan::output();
// dd($result);
$arr = explode("\n", $result);
foreach ($arr as $line) {
preg_match('/"([^"]+)"/', $line, $match); // get the command from between the quotes in the returned output
if (!empty($match)) {
$this->assertTrue($this->downloaded_file_exists_on_disk($this->device2, $match[0]));
}
}
$this->assertGreaterThan(0, count($arr));
$this->assertStringContainsString($arr[0], 'This operation can take some time, depending on how many devices are configured for this task!!!');
$this->assertStringContainsString($arr[1], 'Start rconfig:download-task IDs:888888');
$this->assertStringContainsString($arr[2], 'Start device download for router8 ID:1008');
$this->assertStringContainsString($arr[3], 'No config data returned for router8 - ID:1008. Check your logs for more information');
$this->assertDatabaseHas('devices', [
'id' => 1008,
'status' => 0,
]);
$this->assertDatabaseHas('tasks', [
'id' => 888888,
'task_email_notify' => 1,
'download_report_notify' => 1,
'verbose_download_report_notify' => 0,
]);
// \Queue::assertPushed(\App\Jobs\SendTaskReportNotificationJob::class, 1);
$this->assertDatabaseHas('notifications', [
'notifiable_id' => 1,
'type' => 'App\Notifications\DBDeviceConnectionFailureNotification',
'data' => '{"title":"Device Connection Error","description":"No config data returned for router8 - ID:1008. Check your logs for more information","category":"downloader","error":"error","icon":"pficon-error-circle-o"}',
]);
$this->assertDatabaseHas('notifications', [
'notifiable_id' => 2,
'type' => 'App\Notifications\DBDeviceConnectionFailureNotification',
'data' => '{"title":"Device Connection Error","description":"Unable to connect to 10.0.0.111 - ID:1008","category":"downloader","error":"error","icon":"pficon-error-circle-o"}',
]);
}
private function downloaded_file_exists_on_disk($device, $command)
{
$fileops = new FileOperations(
$command,
$device['category'][0]['categoryName'],
$device['device_name'],
$device['id'],
config_data_path(),
'device_download'
);
$fullpath = $fileops->createFile($command);
return File::exists($fullpath);
}
}