234 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
		
		
			
		
	
	
			234 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
|  | <?php | ||
|  | 
 | ||
|  | require_once dirname(__DIR__, 3) . '/app/classes/database.php'; | ||
|  | require_once dirname(__DIR__, 3) . '/app/classes/agent.php'; | ||
|  | 
 | ||
|  | use PHPUnit\Framework\TestCase; | ||
|  | 
 | ||
|  | class AgentTest extends TestCase | ||
|  | { | ||
|  |     private $db; | ||
|  |     private $agent; | ||
|  | 
 | ||
|  |     protected function setUp(): void | ||
|  |     { | ||
|  |         parent::setUp(); | ||
|  | 
 | ||
|  |         // Set development environment for detailed errors
 | ||
|  |         global $config; | ||
|  |         $config['environment'] = 'development'; | ||
|  | 
 | ||
|  |         // Set up test database
 | ||
|  |         $this->db = new Database([ | ||
|  |             'type' => 'sqlite', | ||
|  |             'dbFile' => ':memory:' | ||
|  |         ]); | ||
|  | 
 | ||
|  |         // Create jilo_agents table
 | ||
|  |         $this->db->getConnection()->exec("
 | ||
|  |             CREATE TABLE jilo_agents ( | ||
|  |                 id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
|  |                 host_id INTEGER NOT NULL, | ||
|  |                 agent_type_id INTEGER NOT NULL, | ||
|  |                 url TEXT NOT NULL, | ||
|  |                 secret_key TEXT, | ||
|  |                 check_period INTEGER DEFAULT 60, | ||
|  |                 created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), | ||
|  |                 updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) | ||
|  |             ) | ||
|  |         ");
 | ||
|  | 
 | ||
|  |         // Create jilo_agent_types table
 | ||
|  |         $this->db->getConnection()->exec("
 | ||
|  |             CREATE TABLE jilo_agent_types ( | ||
|  |                 id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
|  |                 description TEXT NOT NULL, | ||
|  |                 endpoint TEXT NOT NULL | ||
|  |             ) | ||
|  |         ");
 | ||
|  | 
 | ||
|  |         // Create hosts table
 | ||
|  |         $this->db->getConnection()->exec("
 | ||
|  |             CREATE TABLE hosts ( | ||
|  |                 id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
|  |                 platform_id INTEGER NOT NULL, | ||
|  |                 name TEXT NOT NULL | ||
|  |             ) | ||
|  |         ");
 | ||
|  | 
 | ||
|  |         // Insert test host
 | ||
|  |         $this->db->getConnection()->exec("
 | ||
|  |             INSERT INTO hosts (id, platform_id, name) VALUES (1, 1, 'Test Host') | ||
|  |         ");
 | ||
|  | 
 | ||
|  |         // Insert test agent type
 | ||
|  |         $this->db->getConnection()->exec("
 | ||
|  |             INSERT INTO jilo_agent_types (id, description, endpoint)  | ||
|  |             VALUES (1, 'Test Agent Type', '/api/test') | ||
|  |         ");
 | ||
|  | 
 | ||
|  |         $this->agent = new Agent($this->db); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAddAgent() | ||
|  |     { | ||
|  |         $hostId = 1; | ||
|  |         $data = [ | ||
|  |             'type_id' => 1, | ||
|  |             'url' => 'http://test.agent:8080', | ||
|  |             'secret_key' => 'test_secret', | ||
|  |             'check_period' => 60 | ||
|  |         ]; | ||
|  | 
 | ||
|  |         try { | ||
|  |             $result = $this->agent->addAgent($hostId, $data); | ||
|  |             $this->assertTrue($result); | ||
|  | 
 | ||
|  |             // Verify agent was created
 | ||
|  |             $stmt = $this->db->getConnection()->prepare('SELECT * FROM jilo_agents WHERE host_id = ?'); | ||
|  |             $stmt->execute([$hostId]); | ||
|  |             $agent = $stmt->fetch(PDO::FETCH_ASSOC); | ||
|  | 
 | ||
|  |             $this->assertEquals($data['url'], $agent['url']); | ||
|  |             $this->assertEquals($data['secret_key'], $agent['secret_key']); | ||
|  |             $this->assertEquals($data['check_period'], $agent['check_period']); | ||
|  |         } catch (Exception $e) { | ||
|  |             $this->fail('An error occurred while adding agent: ' . $e->getMessage()); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testGetAgentDetails() | ||
|  |     { | ||
|  |         // Add test agent
 | ||
|  |         $hostId = 1; | ||
|  |         $data = [ | ||
|  |             'type_id' => 1, | ||
|  |             'url' => 'http://test.agent:8080', | ||
|  |             'secret_key' => 'test_secret', | ||
|  |             'check_period' => 60 | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $this->agent->addAgent($hostId, $data); | ||
|  | 
 | ||
|  |         // Test getting agent details
 | ||
|  |         $agents = $this->agent->getAgentDetails($hostId); | ||
|  |         $this->assertIsArray($agents); | ||
|  |         $this->assertCount(1, $agents); | ||
|  |         $this->assertEquals($data['url'], $agents[0]['url']); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testEditAgent() | ||
|  |     { | ||
|  |         // Add test agent
 | ||
|  |         $hostId = 1; | ||
|  |         $data = [ | ||
|  |             'type_id' => 1, | ||
|  |             'url' => 'http://test.agent:8080', | ||
|  |             'secret_key' => 'test_secret', | ||
|  |             'check_period' => 60 | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $this->agent->addAgent($hostId, $data); | ||
|  | 
 | ||
|  |         // Get agent ID
 | ||
|  |         $stmt = $this->db->getConnection()->prepare('SELECT id FROM jilo_agents WHERE host_id = ? LIMIT 1'); | ||
|  |         $stmt->execute([$hostId]); | ||
|  |         $agentId = $stmt->fetch(PDO::FETCH_COLUMN); | ||
|  | 
 | ||
|  |         // Update agent
 | ||
|  |         $updateData = [ | ||
|  |             'type_id' => 1, | ||
|  |             'url' => 'http://updated.agent:8080', | ||
|  |             'secret_key' => 'updated_secret', | ||
|  |             'check_period' => 120, | ||
|  |             'agent_type_id' => 1  // Add this field for the update
 | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $result = $this->agent->editAgent($agentId, $updateData); | ||
|  |         $this->assertTrue($result); | ||
|  | 
 | ||
|  |         // Verify update
 | ||
|  |         $stmt = $this->db->getConnection()->prepare('SELECT * FROM jilo_agents WHERE id = ?'); | ||
|  |         $stmt->execute([$agentId]); | ||
|  |         $agent = $stmt->fetch(PDO::FETCH_ASSOC); | ||
|  | 
 | ||
|  |         $this->assertEquals($updateData['url'], $agent['url']); | ||
|  |         $this->assertEquals($updateData['secret_key'], $agent['secret_key']); | ||
|  |         $this->assertEquals($updateData['check_period'], $agent['check_period']); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testDeleteAgent() | ||
|  |     { | ||
|  |         // Add test agent
 | ||
|  |         $hostId = 1; | ||
|  |         $data = [ | ||
|  |             'type_id' => 1, | ||
|  |             'url' => 'http://test.agent:8080', | ||
|  |             'secret_key' => 'test_secret', | ||
|  |             'check_period' => 60 | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $this->agent->addAgent($hostId, $data); | ||
|  | 
 | ||
|  |         // Get agent ID
 | ||
|  |         $stmt = $this->db->getConnection()->prepare('SELECT id FROM jilo_agents WHERE host_id = ? LIMIT 1'); | ||
|  |         $stmt->execute([$hostId]); | ||
|  |         $agentId = $stmt->fetch(PDO::FETCH_COLUMN); | ||
|  | 
 | ||
|  |         // Delete agent
 | ||
|  |         $result = $this->agent->deleteAgent($agentId); | ||
|  |         $this->assertTrue($result); | ||
|  | 
 | ||
|  |         // Verify deletion
 | ||
|  |         $stmt = $this->db->getConnection()->prepare('SELECT COUNT(*) FROM jilo_agents WHERE id = ?'); | ||
|  |         $stmt->execute([$agentId]); | ||
|  |         $count = $stmt->fetch(PDO::FETCH_COLUMN); | ||
|  | 
 | ||
|  |         $this->assertEquals(0, $count); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testFetchAgent() | ||
|  |     { | ||
|  |         // Add test agent
 | ||
|  |         $hostId = 1; | ||
|  |         $data = [ | ||
|  |             'type_id' => 1, | ||
|  |             'url' => 'http://test.agent:8080', | ||
|  |             'secret_key' => 'test_secret', | ||
|  |             'check_period' => 60 | ||
|  |         ]; | ||
|  | 
 | ||
|  |         $this->agent->addAgent($hostId, $data); | ||
|  | 
 | ||
|  |         // Get agent ID
 | ||
|  |         $stmt = $this->db->getConnection()->prepare('SELECT id FROM jilo_agents WHERE host_id = ? LIMIT 1'); | ||
|  |         $stmt->execute([$hostId]); | ||
|  |         $agentId = $stmt->fetch(PDO::FETCH_COLUMN); | ||
|  | 
 | ||
|  |         // Mock fetch response
 | ||
|  |         $mockAgent = $this->getMockBuilder(Agent::class) | ||
|  |             ->setConstructorArgs([$this->db]) | ||
|  |             ->onlyMethods(['fetchAgent']) | ||
|  |             ->getMock(); | ||
|  | 
 | ||
|  |         $mockResponse = json_encode([ | ||
|  |             'status' => 'ok', | ||
|  |             'metrics' => [ | ||
|  |                 'cpu_usage' => 25.5, | ||
|  |                 'memory_usage' => 1024, | ||
|  |                 'uptime' => 3600 | ||
|  |             ] | ||
|  |         ]); | ||
|  | 
 | ||
|  |         $mockAgent->expects($this->once()) | ||
|  |             ->method('fetchAgent') | ||
|  |             ->willReturn($mockResponse); | ||
|  | 
 | ||
|  |         $response = $mockAgent->fetchAgent($agentId); | ||
|  |         $this->assertJson($response); | ||
|  | 
 | ||
|  |         $data = json_decode($response, true); | ||
|  |         $this->assertEquals('ok', $data['status']); | ||
|  |     } | ||
|  | } |