vmDataService = new VMDataService(); } /** @test */ public function it_can_save_vm_data_successfully() { // Arrange $customer = Customer::factory()->create(); $order = Order::factory()->create(['customer_id' => $customer->id]); $host = ModuleHost::factory()->create(); $product = Product::factory()->create(['module_host_id' => $host->id]); $orderItem = OrderItem::factory()->create([ 'order_id' => $order->id, 'product_id' => $product->id ]); $vmwareId = 'vm-12345'; $ipAddresses = [ ['ip' => '192.168.1.100', 'type' => 'IPV4', 'state' => 'PREFERRED'] ]; // Act $result = $this->vmDataService->saveVMData($orderItem, $vmwareId, $ipAddresses); // Assert $this->assertTrue($result['success']); $this->assertInstanceOf(ModuleVmware::class, $result['vm']); $this->assertInstanceOf(ModuleIpAddress::class, $result['ip_address']); $this->assertEquals($vmwareId, $result['vm']->vmware_id); $this->assertEquals('192.168.1.100', $result['ip_address']->ip); $this->assertEquals($customer->id, $result['vm']->customer_id); $this->assertEquals($order->id, $result['vm']->order_id); } /** @test */ public function it_can_update_existing_vm_data() { // Arrange $customer = Customer::factory()->create(); $order = Order::factory()->create(['customer_id' => $customer->id]); $host = ModuleHost::factory()->create(); $product = Product::factory()->create(['module_host_id' => $host->id]); $orderItem = OrderItem::factory()->create([ 'order_id' => $order->id, 'product_id' => $product->id ]); $vmwareId = 'vm-12345'; $ipAddresses = [ ['ip' => '192.168.1.100', 'type' => 'IPV4', 'state' => 'PREFERRED'] ]; // Create existing VM $existingVM = ModuleVmware::factory()->create([ 'vmware_id' => $vmwareId, 'name' => $product->name ]); // Act $result = $this->vmDataService->saveVMData($orderItem, $vmwareId, $ipAddresses); // Assert $this->assertTrue($result['success']); $this->assertEquals($existingVM->id, $result['vm']->id); $this->assertEquals($order->id, $result['vm']->order_id); } /** @test */ public function it_can_update_vm_status() { // Arrange $vm = ModuleVmware::factory()->create(['vmware_id' => 'vm-12345']); // Act $result = $this->vmDataService->updateVMStatus('vm-12345', 2); // Assert $this->assertTrue($result); $this->assertEquals(2, $vm->fresh()->status); } /** @test */ public function it_can_update_vm_ip_address() { // Arrange $ipAddress = ModuleIpAddress::factory()->create(['ip' => '192.168.1.100']); $vm = ModuleVmware::factory()->create([ 'vmware_id' => 'vm-12345', 'module_ip_address_id' => $ipAddress->id ]); // Act $result = $this->vmDataService->updateVMIPAddress('vm-12345', '192.168.1.200'); // Assert $this->assertTrue($result); $this->assertEquals('192.168.1.200', $ipAddress->fresh()->ip); $this->assertEquals(1, $ipAddress->fresh()->status); } /** @test */ public function it_returns_false_when_vm_not_found_for_status_update() { // Act $result = $this->vmDataService->updateVMStatus('non-existent-vm', 1); // Assert $this->assertFalse($result); } /** @test */ public function it_returns_false_when_vm_not_found_for_ip_update() { // Act $result = $this->vmDataService->updateVMIPAddress('non-existent-vm', '192.168.1.100'); // Assert $this->assertFalse($result); } /** @test */ public function it_handles_payment_fields_with_default_values() { // Arrange $customer = Customer::factory()->create(); $order = Order::factory()->create([ 'customer_id' => $customer->id, 'first_payment' => null, // Test null value 'next_payment' => '', // Test empty string 'next_invoice' => 'invalid', // Test invalid value ]); $host = ModuleHost::factory()->create(); $product = Product::factory()->create(['module_host_id' => $host->id]); $orderItem = OrderItem::factory()->create([ 'order_id' => $order->id, 'product_id' => $product->id ]); $vmwareId = 'vm-12345'; $ipAddresses = [ ['ip' => '192.168.1.100', 'type' => 'IPV4', 'state' => 'PREFERRED'] ]; // Act $result = $this->vmDataService->saveVMData($orderItem, $vmwareId, $ipAddresses); // Assert $this->assertTrue($result['success']); $this->assertEquals(0, $result['vm']->first_payment); // Should default to 0 $this->assertEquals(0, $result['vm']->next_payment); // Should default to 0 $this->assertEquals(0, $result['vm']->next_invoice); // Should default to 0 $this->assertEquals('0.0.0.0', $result['ip_address']->gateway); // Should default to 0.0.0.0 } /** @test */ public function it_handles_valid_payment_fields() { // Arrange $customer = Customer::factory()->create(); $order = Order::factory()->create([ 'customer_id' => $customer->id, 'first_payment' => 100000, 'next_payment' => 200000, 'next_invoice' => 300000, ]); $host = ModuleHost::factory()->create(); $product = Product::factory()->create(['module_host_id' => $host->id]); $orderItem = OrderItem::factory()->create([ 'order_id' => $order->id, 'product_id' => $product->id ]); $vmwareId = 'vm-12345'; $ipAddresses = [ ['ip' => '192.168.1.100', 'type' => 'IPV4', 'state' => 'PREFERRED'] ]; // Act $result = $this->vmDataService->saveVMData($orderItem, $vmwareId, $ipAddresses); // Assert $this->assertTrue($result['success']); $this->assertEquals(100000, $result['vm']->first_payment); $this->assertEquals(200000, $result['vm']->next_payment); $this->assertEquals(300000, $result['vm']->next_invoice); } /** * Test saving VM data with server_name in order item (should create new records) */ public function test_save_vm_data_with_server_name(): void { // Arrange $orderItem = OrderItem::factory()->create([ 'server_name' => 'linuxtestpb.com' ]); $vmwareId = 'vm-12345'; $ipAddresses = [ ['ip' => '192.168.1.100', 'type' => 'ipv4'] ]; // Mock the product and related models $product = Mockery::mock(); $product->shouldReceive('getAttribute')->andReturnSelf(); $product->name = 'Test Product'; $product->host = Mockery::mock(['id' => 1]); $product->ipAddress = null; $orderItem->shouldReceive('getProductAttribute')->andReturn($product); $orderItem->order = Mockery::mock([ 'id' => 1, 'customer' => Mockery::mock(['id' => 1]), 'first_payment' => 100, 'next_payment' => 200, 'next_invoice' => 300, 'next_due_date' => now()->addMonth() ]); // Mock ModuleIpAddress - should only create $ipAddress = Mockery::mock(ModuleIpAddress::class); $ipAddress->id = 1; ModuleIpAddress::shouldReceive('create') ->andReturn($ipAddress); // Mock ModuleVmware - should only create $vm = Mockery::mock(ModuleVmware::class); $vm->id = 1; $vm->vmware_id = $vmwareId; ModuleVmware::shouldReceive('create') ->andReturn($vm); // Act $result = $this->vmDataService->saveVMData($orderItem, $vmwareId, $ipAddresses); // Assert $this->assertTrue($result['success']); $this->assertEquals($vm, $result['vm']); $this->assertEquals($ipAddress, $result['ip_address']); $this->assertArrayNotHasKey('skipped', $result); } /** * Test saving VM data without server_name in order item (should skip saving) */ public function test_save_vm_data_without_server_name(): void { // Arrange $orderItem = OrderItem::factory()->create([ 'server_name' => null ]); $vmwareId = 'vm-12345'; $ipAddresses = [ ['ip' => '192.168.1.100', 'type' => 'ipv4'] ]; // Act $result = $this->vmDataService->saveVMData($orderItem, $vmwareId, $ipAddresses); // Assert $this->assertTrue($result['success']); $this->assertTrue($result['skipped']); $this->assertEquals('Bỏ qua lưu dữ liệu VM vì không có server_name trong order item', $result['message']); $this->assertArrayNotHasKey('vm', $result); $this->assertArrayNotHasKey('ip_address', $result); } /** * Test saving VM data with empty server_name in order item (should skip saving) */ public function test_save_vm_data_with_empty_server_name(): void { // Arrange $orderItem = OrderItem::factory()->create([ 'server_name' => '' ]); $vmwareId = 'vm-12345'; $ipAddresses = [ ['ip' => '192.168.1.100', 'type' => 'ipv4'] ]; // Act $result = $this->vmDataService->saveVMData($orderItem, $vmwareId, $ipAddresses); // Assert $this->assertTrue($result['success']); $this->assertTrue($result['skipped']); $this->assertEquals('Bỏ qua lưu dữ liệu VM vì không có server_name trong order item', $result['message']); $this->assertArrayNotHasKey('vm', $result); $this->assertArrayNotHasKey('ip_address', $result); } }