actingAs($this->user); $this->get(route('services', [ 'server' => $this->server, ])) ->assertSuccessful() ->assertInertia(fn (AssertableInertia $page) => $page->component('services/index')); } /** * @dataProvider data */ public function test_restart_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); $service->status = ServiceStatus::STOPPED; $service->save(); SSH::fake('Active: active'); $this->post(route('services.restart', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::READY, $service->status); } /** * @dataProvider data */ public function test_failed_to_restart_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); SSH::fake('Active: inactive'); $this->post(route('services.restart', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::FAILED, $service->status); } /** * @dataProvider data */ public function test_stop_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); SSH::fake('Active: inactive'); $this->post(route('services.stop', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::STOPPED, $service->status); } /** * @dataProvider data */ public function test_failed_to_stop_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); SSH::fake('Active: active'); $this->post(route('services.stop', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::FAILED, $service->status); } /** * @dataProvider data */ public function test_start_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); $service->status = ServiceStatus::STOPPED; $service->save(); SSH::fake('Active: active'); $this->post(route('services.start', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::READY, $service->status); } /** * @dataProvider data */ public function test_failed_to_start_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); SSH::fake('Active: inactive'); $this->post(route('services.start', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::FAILED, $service->status); } /** * @dataProvider data */ public function test_enable_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); $service->status = ServiceStatus::DISABLED; $service->save(); SSH::fake('Active: active'); $this->post(route('services.enable', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::READY, $service->status); } /** * @dataProvider data */ public function test_failed_to_enable_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); SSH::fake('Active: inactive'); $this->post(route('services.enable', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::FAILED, $service->status); } /** * @dataProvider data */ public function test_disable_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); SSH::fake('Active: inactive'); $this->post(route('services.disable', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::DISABLED, $service->status); } /** * @dataProvider data */ public function test_failed_to_disable_service(string $name): void { $this->actingAs($this->user); $service = $this->server->services()->where('name', $name)->firstOrFail(); SSH::fake('Active: active'); $this->post(route('services.disable', [ 'server' => $this->server, 'service' => $service->id, ])) ->assertSessionDoesntHaveErrors(); $service->refresh(); $this->assertEquals(ServiceStatus::FAILED, $service->status); } /** * @dataProvider installData */ public function test_install_service(string $name, string $type, string $version): void { Http::fake([ 'https://api.github.com/repos/vito/vito-agent/releases/latest' => Http::response([ 'tag_name' => '0.1.0', ]), ]); SSH::fake('Active: active'); $this->actingAs($this->user); $server = Server::factory()->create([ 'user_id' => $this->user->id, 'project_id' => $this->user->current_project_id, ]); $keys = $server->sshKey(); if (! File::exists($keys['public_key_path']) || ! File::exists($keys['private_key_path'])) { $server->provider()->generateKeyPair(); } $this->post(route('services.store', [ 'server' => $server, ]), [ 'name' => $name, 'version' => $version, ]) ->assertSessionDoesntHaveErrors(); $this->assertDatabaseHas('services', [ 'server_id' => $server->id, 'name' => $name, 'type' => $type, 'status' => ServiceStatus::READY, ]); } /** * @return array> */ public static function data(): array { return [ ['nginx'], ['php'], ['supervisor'], ['redis'], ['mysql'], ]; } /** * @return array> */ public static function installData(): array { return [ [ 'nginx', 'webserver', 'latest', ], [ 'caddy', 'webserver', 'latest', ], [ 'php', 'php', '7.4', ], [ 'nodejs', 'nodejs', '16', ], [ 'supervisor', 'process_manager', 'latest', ], [ 'redis', 'memory_database', 'latest', ], [ 'mysql', 'database', '8.0', ], [ 'mariadb', 'database', '10.4', ], [ 'postgresql', 'database', '16', ], [ 'vito-agent', 'monitoring', 'latest', ], ]; } }