diff options
Diffstat (limited to '')
-rw-r--r-- | test/php/library/Director/Objects/IcingaServiceSetTest.php | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/test/php/library/Director/Objects/IcingaServiceSetTest.php b/test/php/library/Director/Objects/IcingaServiceSetTest.php new file mode 100644 index 0000000..ad7c135 --- /dev/null +++ b/test/php/library/Director/Objects/IcingaServiceSetTest.php @@ -0,0 +1,183 @@ +<?php + +namespace Tests\Icinga\Module\Director\Objects; + +use Icinga\Module\Director\Objects\IcingaServiceSet; +use Icinga\Module\Director\Test\IcingaObjectTestCase; + +class IcingaServiceSetTest extends IcingaObjectTestCase +{ + protected $table = 'icinga_service_set'; + protected $testObjectName = '___TEST___set'; + + public function setUp() + { + $this->assertNull($this->subject, 'subject must have been taken down before!'); + + if ($this->hasDb()) { + $this->subject = IcingaServiceSet::create(array( + 'object_name' => $this->testObjectName, + 'object_type' => 'template', + )); + $this->subject->store($this->getDb()); + } + } + + public function testUpdatingSet() + { + $set = IcingaServiceSet::load($this->testObjectName, $this->getDb()); + $this->assertTrue($set->hasBeenLoadedFromDb()); + + $set->set('description', 'This is a set created by Phpunit!'); + $this->assertTrue($set->hasBeenModified()); + $set->store(); + + $set->set('assign_filter', 'host.name=foobar'); + $this->assertTrue($set->hasBeenModified()); + $set->store(); + + $this->assertFalse($set->hasBeenModified()); + } + + public function testAddingSetToHost() + { + $host = $this->createObject('for_set', 'icinga_host', array( + 'object_type' => 'object', + 'address' => '1.2.3.4', + )); + + $set = IcingaServiceSet::create(array( + 'object_name' => $this->testObjectName, + 'object_type' => 'object', + ), $this->getDb()); // TODO: fails if db not set here... + + $set->setImports($this->testObjectName); + $this->assertTrue($set->hasBeenModified()); + $this->assertEquals(array($this->testObjectName), $set->getImports()); + + $set->set('host', $host->getObjectName()); + + $set->store(); + $this->prepareObjectTearDown($set); + $this->assertFalse($set->hasBeenModified()); + } + + public function testDeletingHostWithSet() + { + $this->createObject('for_set', 'icinga_host', array( + 'object_type' => 'object', + 'address' => '1.2.3.4', + ), false)->store(); + + $host = $this->loadObject('for_set', 'icinga_host'); + $host->delete(); + + $this->checkForDanglingHostSets(); + } + + public function testAddingServicesToSet() + { + $set = IcingaServiceSet::load($this->testObjectName, $this->getDb()); + + // TODO: setting service_set by name should work too... + + $serviceA = $this->createObject('serviceA', 'icinga_service', array( + 'object_type' => 'apply', + 'service_set_id' => $set->getAutoincId(), + )); + $nameA = $serviceA->getObjectName(); + + $serviceB = $this->createObject('serviceB', 'icinga_service', array( + 'object_type' => 'apply', + 'service_set_id' => $set->getAutoincId(), + )); + $nameB = $serviceB->getObjectName(); + + $services = $set->getServiceObjects(); + + $this->assertCount(2, $services); + $this->assertArrayHasKey($nameA, $services); + $this->assertArrayHasKey($nameB, $services); + $this->assertEquals($serviceA->getAutoincId(), $services[$nameA]->getAutoincId()); + $this->assertEquals($serviceB->getAutoincId(), $services[$nameB]->getAutoincId()); + + // TODO: deleting set should delete services + + $this->checkForDanglingServices(); + } + + /** + * @expectedException \RuntimeException + */ + public function testCreatingSetWithoutType() + { + $set = IcingaServiceSet::create(array( + 'object_name' => '___TEST__set_BAD', + )); + $set->store($this->getDb()); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testCreatingServiceSetWithoutHost() + { + $set = IcingaServiceSet::create(array( + 'object_name' => '___TEST__set_BAD2', + 'object_type' => 'object', + )); + + $set->store($this->getDb()); + } + + public function testDeletingSet() + { + $set = IcingaServiceSet::load($this->testObjectName, $this->getDb()); + $set->delete(); + + $this->assertFalse(IcingaServiceSet::exists($this->testObjectName, $this->getDb())); + $this->subject = null; + } + + public function checkForDanglingServices() + { + $db = $this->getDb()->getDbAdapter(); + $query = $db->select() + ->from(array('s' => 'icinga_service'), array('id')) + ->joinLeft( + array('ss' => 'icinga_service_set'), + 'ss.id = s.service_set_id', + array() + ) + ->where('s.service_set_id IS NOT NULL') + ->where('ss.id IS NULL'); + + $ids = $db->fetchCol($query); + + $this->assertEmpty($ids, sprintf('Found dangling service_set services in database: %s', join(', ', $ids))); + } + + public function checkForDanglingHostSets() + { + $db = $this->getDb()->getDbAdapter(); + $query = $db->select() + ->from(array('ss' => 'icinga_service_set'), array('id')) + ->joinLeft( + array('h' => 'icinga_host'), + 'h.id = ss.host_id', + array() + ) + ->where('ss.host_id IS NOT NULL') + ->where('h.id IS NULL'); + + $ids = $db->fetchCol($query); + + $this->assertEmpty( + $ids, + sprintf( + 'Found dangling service_set\'s for a host, without the host in database: %s', + join(', ', $ids) + ) + ); + } +} |