[Checkins] SVN: Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/ getActivityChartData() refactored into individual methods for testing and tests added.

Charlie Clark charlie at begeistert.org
Thu Dec 8 13:09:46 UTC 2011


Log message for revision 123628:
  getActivityChartData() refactored into individual methods for testing and tests added.
  

Changed:
  U   Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py
  U   Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py

-=-
Modified: Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py
===================================================================
--- Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py	2011-12-08 12:37:43 UTC (rev 123627)
+++ Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/activity.py	2011-12-08 13:09:46 UTC (rev 123628)
@@ -34,6 +34,7 @@
                      {'stores': 0, 'connections': 0, 'store_len': 40, 'end': 1323022511.8497, 'start': 1323022151.8497, 'load_len': 30, 'loads': 0, 'time_offset': '0m', 'link':''}],
             'total_store_count': 0, 'total_connections': 0}
 
+
 class View(object):
 
     start_time = 'start_time'
@@ -63,6 +64,57 @@
             return 0
         return am.getHistoryLength()
 
+    def _get_timings(self, analysis):
+        """Calculate time intervals and format start and end times"""
+        segment_time = 0
+        start_time = ''
+        end_time = ''
+        if analysis is not None:
+            segment_time = analysis[0]['end'] - analysis[0]['start']
+            start_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
+                                       time.gmtime(analysis[0]['start']))
+            end_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
+                                     time.gmtime(analysis[-1]['end']))
+        return start_time, end_time, segment_time
+
+    def _chart_data(self, segment_time, segment_height, analysis):
+        """Utility function to calculate bar heights and time offsets"""
+
+        limit = max(((d['stores'] + d['loads']) for d in analysis))
+
+        now = analysis[-1]['end']
+        for div in analysis:
+            stores = div['stores']
+            loads = div['loads']
+            store_len = 0
+            load_len = 0
+
+            if stores > 0:
+                store_len = max((segment_height * stores / limit), 1)
+            if loads > 0:
+                load_len = max((segment_height * loads / limit), 1)
+
+            offset = div['end'] - now  # Offset from most recent measurement.
+            if segment_time >= 3600:
+                # Show hours.
+                time_offset = '%dh' % (offset / 3600)
+            elif segment_time >= 60:
+                # Show minutes.
+                time_offset = '%dm' % (offset / 60)
+            elif segment_time >= 1:
+                # Show seconds.
+                time_offset = '%ds' % offset
+            else:
+                # Show fractions.
+                time_offset = '%.2fs' % offset
+
+            div.update({'link': 'chart_start=%s&chart_end=%s' % (div['start'], div['end']),
+                        'time_offset': time_offset,
+                        'store_len': store_len,
+                        'load_len': load_len,
+                        })
+            yield div
+
     def getActivityChartData(self, segment_height=200, REQUEST=None):
         """Returns information for generating an activity chart.
         Default height is 200 pixels
@@ -70,7 +122,7 @@
         segment_height = int(segment_height)
         am = self._getActivityMonitor()
         if am is None:
-            return None
+            return
 
         if REQUEST is not None:
             start = float(REQUEST.get('chart_start', 0))
@@ -80,63 +132,16 @@
         else:
             analysis = am.getActivityAnalysis()
 
-        segment_time = 0
-        start_time = ''
-        end_time = ''
-        if analysis is not None:
-            segment_time = analysis[0]['end'] - analysis[0]['start']
-            start_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
-                                       time.gmtime(analysis[0]['start']))
-            end_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z",
-                                     time.gmtime(analysis[-1]['end']))
+        start_time, end_time, segment_time = self._get_timings(analysis)
 
-        divs = []
-
         total_stores, total_loads, total_connections = (
             sum(d[k] for d in analysis)
             for k in ('stores', 'loads', 'connections')
         )
 
-        limit = max(((d['stores'] + d['loads']) for d in analysis))
-
-        def calculated():
-            """Utility function to calculate bar heights and time offsets"""
-            now = analysis[-1]['end']
-            for div in analysis:
-                stores = div['stores']
-                loads = div['loads']
-                store_len = 0
-                load_len = 0
-
-                if stores > 0:
-                    store_len = max((segment_height * stores / limit), 1)
-                if loads > 0:
-                    load_len = max((segment_height * loads / limit), 1)
-
-                offset = div['end'] - now  # Offset from most recent measurement.
-                if segment_time >= 3600:
-                    # Show hours.
-                    time_offset = '%dh' % (offset / 3600)
-                elif segment_time >= 60:
-                    # Show minutes.
-                    time_offset = '%dm' % (offset / 60)
-                elif segment_time >= 1:
-                    # Show seconds.
-                    time_offset = '%ds' % offset
-                else:
-                    # Show fractions.
-                    time_offset = '%.2fs' % offset
-
-                div.update({'link': 'chart_start=%s&chart_end=%s' % (div['start'], div['end']),
-                            'time_offset': time_offset,
-                            'store_len': store_len,
-                            'load_len': load_len,
-                            })
-                yield div
-
         return {'start_time': start_time,
                'end_time': end_time,
-               'divs': calculated,
+               'divs': self._chart_data(segment_time, segment_height, analysis),
                'total_store_count': total_stores,
                'total_load_count': total_loads,
                'total_connections': total_connections,

Modified: Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py
===================================================================
--- Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py	2011-12-08 12:37:43 UTC (rev 123627)
+++ Sandbox/jens/zmi.core/trunk/src/zmi/core/browser/database/tests/test_activity.py	2011-12-08 13:09:46 UTC (rev 123628)
@@ -14,6 +14,26 @@
 import unittest
 
 
+seconds_activity = [
+    {'end':1, 'connections':15, 'start':0,'stores':5, 'loads':10},
+    {'end':2, 'connections':25, 'start':1,'stores':15,'loads':10}
+]
+
+minutes_activity = [
+    {'end':3600, 'connections':15, 'start':0, 'stores':250, 'loads':1000},
+    {'end':3601, 'connections':15, 'start':86400, 'stores':500, 'loads':2000}
+]
+
+hours_activity = [
+    {'end':86400, 'connections':15, 'start':0, 'stores':250,' loads':1000},
+    {'end':172800, 'connections':15, 'start':86400, 'stores':500, 'loads':2000}
+]
+
+fractional_activity = [
+    {'end':0.5, 'connections':15, 'start':0, 'stores':250, 'loads':1000},
+    {'end':1, 'connections':15, 'start':0.5, 'stores':500, 'loads':2000}
+]
+
 class DummyDatabaseConnection:
 
     def __init__(self):
@@ -23,7 +43,7 @@
         return self
 
     def getActivityMonitor(self):
-        pass
+        return getattr(self, 'am', None)
 
 
 class DummyDatabaseObject:
@@ -34,21 +54,18 @@
 
 class DummyActivityMonitor:
 
+    def __init__(self, activity=seconds_activity):
+        self.activity = activity[:]
+
     def getHistoryLength(self):
-        pass
+        return 3600
 
-    def getActivityAnalysis(start=None, end=None, divisions=None):
-        pass
+    def getActivityAnalysis(self, start=None, end=None, divisions=None):
+        return self.activity
 
 
 class Tests(unittest.TestCase):
 
-    def setUp(self):
-        pass
-
-    def tearDown(self):
-        pass
-
     def _getTargetClass(self):
         from zmi.core.browser.database.activity import View
         return View
@@ -58,11 +75,76 @@
         view = self._getTargetClass()
         return view(root, {})
 
-    def test_db(self):
+    def test_no_activity_monitor(self):
         view = self._makeOne()
-        return True
+        delattr(view._db, 'am')
 
+        history = view.getHistoryLength()
+        self.assertEqual(history, 0)
 
+        am = view._getActivityMonitor()
+        self.assertIsNone(am)
+
+        data = view.getActivityChartData()
+        self.assertIsNone(data)
+
+
+    def test_getHistoryLength(self):
+        view = self._makeOne()
+        self.assertEqual(view.getHistoryLength(), 3600)
+
+    def test_timings_seconds(self):
+        view = self._makeOne()
+        data = view._get_timings(seconds_activity)
+        expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+                    'Thu, 01 Jan 1970 00:00:02 CET',
+                    1)
+        self.assertEqual(data, expected)
+
+    def test_timings_minutes(self):
+        view = self._makeOne()
+        data = view._get_timings(minutes_activity)
+        expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+                    'Thu, 01 Jan 1970 01:00:01 CET',
+                    3600)
+        self.assertEqual(data, expected)
+
+    def test_timings_hours(self):
+        view = self._makeOne()
+        data = view._get_timings(hours_activity)
+        expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+                    'Sat, 03 Jan 1970 00:00:00 CET',
+                    86400)
+        self.assertEqual(data, expected)
+
+    def test_timings_fractions(self):
+        view = self._makeOne()
+        data = view._get_timings(fractional_activity)
+        expected = ('Thu, 01 Jan 1970 00:00:00 CET',
+                    'Thu, 01 Jan 1970 00:00:01 CET',
+                    0.5)
+        self.assertEqual(data, expected)
+
+    def test_chart_data(self):
+        view = self._makeOne()
+        start, end, interval = view._get_timings(seconds_activity)
+        data = view._chart_data(interval, 200, seconds_activity).next()
+        expected = {'store_len': 40, 'end': 1, 'load_len': 80,
+                    'connections': 15, 'start': 0, 'link':
+                    'chart_start=0&chart_end=1', 'stores': 5, 'loads': 10,
+                    'time_offset': '-1s'}
+        self.assertEqual(data, expected)
+
+    def test_getActivityChartData(self):
+        view = self._makeOne()
+        data = view.getActivityChartData()
+        expected =  {'start_time': 'Thu, 01 Jan 1970 00:00:00 CET',
+                     'total_load_count': 20,
+                     'end_time': 'Thu, 01 Jan 1970 00:00:02 CET',
+                     'total_store_count': 20, 'total_connections': 40,}
+        for k in expected:
+            self.assertEqual(data[k], expected[k])
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(Tests),



More information about the checkins mailing list