renderDepot threw an exception if any objects with an unnamed container existed ...
authorAaron Dummer <aaron@dummer.info>
Sun, 22 Dec 2013 01:22:06 +0000 (17:22 -0800)
committerAaron Dummer <aaron@dummer.info>
Sun, 22 Dec 2013 01:22:06 +0000 (17:22 -0800)
formatObjectDisplayedName: new function that returns "[ObjectType]" for nameless objects
setDisplayedName: use formatDisplayedName
getContainerInfo: idem

scripts/init-sample-racks.sql
tests/LinkTriggerTest.php
tests/RenderDepotTest.php [new file with mode: 0644]
tests/bootstrap.php
wwwroot/inc/database.php
wwwroot/inc/functions.php
wwwroot/inc/interface.php

index a82716e..d155647 100644 (file)
@@ -80,7 +80,9 @@ INSERT INTO `Object` (`id`, `name`, `label`, `objtype_id`, `asset_no`, `has_prob
 (978,'London',NULL,1562,NULL,'no',NULL),
 (979,'sw-a1',NULL,8,NULL,'no',NULL),
 (980,'sw-a2',NULL,8,NULL,'no',NULL),
-(981,'sw-d1',NULL,8,NULL,'no',NULL);
+(981,'sw-d1',NULL,8,NULL,'no',NULL),
+(982,NULL,NULL,3,NULL,'no',NULL),
+(983,'London modem 1',NULL,13,NULL,'no',NULL);
 
 INSERT INTO `Atom` (`molecule_id`, `rack_id`, `unit_no`, `atom`) VALUES
 (1,967,35,'front'),
@@ -100,7 +102,8 @@ INSERT INTO `EntityLink` (`parent_entity_type`, `parent_entity_id`, `child_entit
 ('location',977,'row',965),
 ('location',978,'row',966),
 ('rack',968,'object',979),
-('rack',969,'object',980);
+('rack',969,'object',980),
+('object',982,'object',983);
 
 INSERT INTO `AttributeValue` (`object_id`, `object_tid`, `attr_id`, `string_value`, `uint_value`, `float_value`) VALUES
 (905,7,2,NULL,269,NULL),
@@ -1553,7 +1556,10 @@ INSERT INTO `RackSpace` (`rack_id`, `unit_no`, `atom`, `state`, `object_id`) VAL
 (972,34,'interior','T',962),
 (972,34,'rear','T',962),
 (967,35,'front','T',981),
-(967,35,'interior','T',981);
+(967,35,'interior','T',981),
+(967,17,'front','T',982),
+(967,17,'interior','T',982),
+(967,17,'rear','T',982);
 
 INSERT INTO `Script` (`script_name`, `script_text`) VALUES
 ('DefaultRSConfig','CONNECT_TIMEOUT=1\nCONNECT_PORT=%RSPORT%\nCHECK_TCP=`TCP_CHECK {\n connect_port %CONNECT_PORT%\n   connect_timeout %CONNECT_TIMEOUT% \n}\'\n%CHECK%\n'),
index 241689e..0d3d1f4 100644 (file)
@@ -4,7 +4,6 @@
 //   - porta != portb
 //   - porta < portb
 //   - porta is compatibile with portb
-
 class LinkTriggerTest extends PHPUnit_Framework_TestCase
 {
        protected $autoports_config_var = NULL;
diff --git a/tests/RenderDepotTest.php b/tests/RenderDepotTest.php
new file mode 100644 (file)
index 0000000..c974481
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+// Make sure renderDepot does not throw any exceptions
+class RenderDepotTest extends PHPUnit_Framework_TestCase
+{
+       protected $shelf_id = NULL;
+       protected $modem_id = NULL;
+
+       public function setUp ()
+       {
+               // create a nameless shelf which contains a modem (re: ticket #1115)
+               $this->shelf_id = commitAddObject (NULL, NULL, 3, NULL);
+               $this->modem_id = commitAddObject ('unit test modem', NULL, 13, NULL);
+               commitLinkEntities ('object', $this->shelf_id, 'object', $this->modem_id);
+       }
+
+       public function tearDown ()
+       {
+               // remove sample data
+               commitDeleteObject ($this->modem_id);
+               commitDeleteObject ($this->shelf_id);
+       }
+
+       public function testRenderDepot ()
+       {
+               try {
+                       ob_start ();
+                       renderDepot ();
+                       ob_clean ();
+                       $this->assertTrue (TRUE);
+               }
+               catch (Exception $e) {
+                       ob_clean ();
+               $this->assertTrue (FALSE);
+        }
+       }
+}
+?>
index 7063870..85863c9 100644 (file)
@@ -6,4 +6,5 @@ global $pdo_dsn, $db_username, $db_password;
 global $remote_username, $SQLSchema, $configCache, $script_mode;
 $script_mode = TRUE;
 require_once '../wwwroot/inc/init.php';
+require_once '../wwwroot/inc/interface.php';
 ?>
index 784957e..8b5e98b 100644 (file)
@@ -407,21 +407,21 @@ function getContainerInfo ($object_ids)
                return array ();
        $result = usePreparedSelectBlade
        (
-               'SELECT EL.child_entity_id, EL.parent_entity_id, O.name ' .
+               'SELECT EL.child_entity_id, EL.parent_entity_id, RO.name, RO.objtype_id ' .
                'FROM EntityLink EL ' .
-               'LEFT JOIN Object O ON EL.parent_entity_id = O.id ' .
+               'LEFT JOIN RackObject RO ON EL.parent_entity_id = RO.id ' .
                'WHERE EL.child_entity_id IN (' . questionMarks (count ($object_ids)) . ') ' .
                "AND EL.parent_entity_type = 'object' " .
                "AND EL.child_entity_type = 'object' " .
-               'ORDER BY O.name',
+               'ORDER BY RO.name',
                $object_ids
        );
        $ret = array ();
        foreach ($result as $row)
                $ret[$row['child_entity_id']][] = array
                (
-                       'container_id'   => $row['parent_entity_id'],
-                       'container_name' => $row['name']
+                       'container_id'    => $row['parent_entity_id'],
+                       'container_dname' => formatObjectDisplayedName ($row['name'], $row['objtype_id'])
                );
        unset ($result);
        return $ret;
index e71988e..341f153 100644 (file)
@@ -429,31 +429,26 @@ function fillBypassValues ($pageno, &$args)
 // Objects of some types should be explicitly shown as
 // anonymous (labelless). This function is a single place where the
 // decision about displayed name is made.
+function formatObjectDisplayedName ($name, $objtype_id)
+{
+       return ($name != '') ? $name : sprintf ('[%s]', decodeObjectType ($objtype_id, 'o'));
+}
+
+// Set the dname attribute within a cell
 function setDisplayedName (&$cell)
 {
        if ($cell['realm'] == 'object')
        {
-               if ($cell['name'] != '')
-                       $cell['dname'] = $cell['name'];
-               else
-                       $cell['dname'] = '[' . decodeObjectType ($cell['objtype_id'], 'o') . ']';
-               // If the object has a container, apply the same logic to the container name
-               $cell['container_dname'] = NULL;
+               $cell['dname'] = formatObjectDisplayedName ($cell['name'], $cell['objtype_id']);
+               // If the object has a container, set its dname as well
                if ($cell['container_id'])
-               {
-                       if ($cell['container_name'] != '')
-                               $cell['container_dname'] = $cell['container_name'];
-                       else
-                               $cell['container_dname'] = '[' . decodeObjectType ($cell['container_objtype_id'], 'o') . ']';
-               }
+                       $cell['container_dname'] = formatObjectDisplayedName ($cell['container_name'], $cell['container_objtype_id']);
        }
        elseif ($cell['realm'] == 'ipv4vs')
-       {
                if ($cell['proto'] == 'MARK')
-                       $cell['dname'] = "fwmark: " . implode ('', unpack('N', substr ($cell['vip_bin'], 0, 4)));
+                       $cell['dname'] = 'fwmark: ' . implode ('', unpack ('N', substr ($cell['vip_bin'], 0, 4)));
                else
                        $cell['dname'] = $cell['vip'] . ':' . $cell['vport'] . '/' . $cell['proto'];
-       }
 }
 
 // This function finds height of solid rectangle of atoms that are all
index fb4334a..6244684 100644 (file)
@@ -2161,7 +2161,7 @@ function renderDepot ()
        elseif (! ($cellfilter['is_empty'] && renderEmptyResults ($cellfilter, 'objects', $objects_count)))
        {
                $objects = filterCellList (listCells ('object'), $cellfilter['expression']);
-               // 2st attempt: do not render all fetched objects if rendering empty result is enabled
+               // 2nd attempt: do not render all fetched objects if rendering empty result is enabled
                if (! renderEmptyResults ($cellfilter, 'objects', count($objects)))
                {
                        startPortlet ('Objects (' . count ($objects) . ')');
@@ -2184,7 +2184,7 @@ function renderDepot ()
                                $places = array();
                                if (array_key_exists ($obj['id'], $containerinfo))
                                        foreach ($containerinfo[$obj['id']] as $ci)
-                                               $places[] = mkA ($ci['container_name'], 'object', $ci['container_id']);
+                                               $places[] = mkA ($ci['container_dname'], 'object', $ci['container_id']);
                                if (array_key_exists ($obj['id'], $mountinfo))
                                        foreach ($mountinfo[$obj['id']] as $mi)
                                                $places[] = mkA ($mi['row_name'], 'row', $mi['row_id']) . '/' . mkA ($mi['rack_name'], 'rack', $mi['rack_id']);