Removes Horizon's "time" module.

The module was an unnecessary hack for lazy test-writing.

Implements blueprint remove-horizon-time-module.

Change-Id: Ibeabd2b1689619a8e00c3346cef9401e5850d375
This commit is contained in:
Gabriel Hurley 2012-06-19 13:29:23 -07:00
parent 359a71e0b0
commit b9be56f209
6 changed files with 19 additions and 93 deletions

View File

@ -34,14 +34,6 @@ INDEX_URL = reverse('horizon:nova:instances_and_volumes:index')
class InstanceViewTests(test.TestCase): class InstanceViewTests(test.TestCase):
def setUp(self):
super(InstanceViewTests, self).setUp()
self.now = self.override_times()
def tearDown(self):
super(InstanceViewTests, self).tearDown()
self.reset_times()
@test.create_stubs({api: ('server_list', @test.create_stubs({api: ('server_list',
'flavor_list', 'flavor_list',
'server_delete', 'server_delete',

View File

@ -23,7 +23,6 @@ import datetime
from django import http from django import http
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from mox import IsA from mox import IsA
from novaclient import exceptions as nova_exceptions
from horizon import api from horizon import api
from horizon import test from horizon import test
@ -34,17 +33,12 @@ INDEX_URL = reverse('horizon:nova:overview:index')
class UsageViewTests(test.TestCase): class UsageViewTests(test.TestCase):
def tearDown(self):
super(UsageViewTests, self).tearDown()
self.reset_times() # override_times is called in the tests
def test_usage(self): def test_usage(self):
now = self.override_times() now = datetime.datetime.utcnow()
usage_obj = api.nova.Usage(self.usages.first()) usage_obj = api.nova.Usage(self.usages.first())
self.mox.StubOutWithMock(api, 'usage_get') self.mox.StubOutWithMock(api, 'usage_get')
api.usage_get(IsA(http.HttpRequest), self.tenant.id, api.usage_get(IsA(http.HttpRequest), self.tenant.id,
datetime.datetime(now.year, now.month, 1, datetime.datetime(now.year, now.month, 1, 0, 0, 0),
now.hour, now.minute, now.second),
datetime.datetime(now.year, now.month, now.day, now.hour, datetime.datetime(now.year, now.month, now.day, now.hour,
now.minute, now.second)) \ now.minute, now.second)) \
.AndReturn(usage_obj) .AndReturn(usage_obj)
@ -56,12 +50,10 @@ class UsageViewTests(test.TestCase):
self.assertContains(res, 'form-horizontal') self.assertContains(res, 'form-horizontal')
def test_usage_csv(self): def test_usage_csv(self):
now = self.override_times() now = datetime.datetime.utcnow()
usage_obj = api.nova.Usage(self.usages.first()) usage_obj = api.nova.Usage(self.usages.first())
self.mox.StubOutWithMock(api, 'usage_get') self.mox.StubOutWithMock(api, 'usage_get')
timestamp = datetime.datetime(now.year, now.month, 1, timestamp = datetime.datetime(now.year, now.month, 1, 0, 0, 0)
now.hour, now.minute,
now.second)
api.usage_get(IsA(http.HttpRequest), api.usage_get(IsA(http.HttpRequest),
self.tenant.id, self.tenant.id,
timestamp, timestamp,
@ -76,10 +68,9 @@ class UsageViewTests(test.TestCase):
self.assertTrue(isinstance(res.context['usage'], usage.TenantUsage)) self.assertTrue(isinstance(res.context['usage'], usage.TenantUsage))
def test_usage_exception(self): def test_usage_exception(self):
now = self.override_times() now = datetime.datetime.utcnow()
self.mox.StubOutWithMock(api, 'usage_get') self.mox.StubOutWithMock(api, 'usage_get')
timestamp = datetime.datetime(now.year, now.month, 1, now.hour, timestamp = datetime.datetime(now.year, now.month, 1, 0, 0, 0)
now.minute, now.second)
api.usage_get(IsA(http.HttpRequest), api.usage_get(IsA(http.HttpRequest),
self.tenant.id, self.tenant.id,
timestamp, timestamp,
@ -93,12 +84,10 @@ class UsageViewTests(test.TestCase):
self.assertEqual(res.context['usage'].usage_list, []) self.assertEqual(res.context['usage'].usage_list, [])
def test_usage_default_tenant(self): def test_usage_default_tenant(self):
now = self.override_times() now = datetime.datetime.utcnow()
usage_obj = api.nova.Usage(self.usages.first()) usage_obj = api.nova.Usage(self.usages.first())
self.mox.StubOutWithMock(api, 'usage_get') self.mox.StubOutWithMock(api, 'usage_get')
timestamp = datetime.datetime(now.year, now.month, 1, timestamp = datetime.datetime(now.year, now.month, 1, 0, 0, 0)
now.hour, now.minute,
now.second)
api.usage_get(IsA(http.HttpRequest), api.usage_get(IsA(http.HttpRequest),
self.tenant.id, self.tenant.id,
timestamp, timestamp,

View File

@ -34,20 +34,15 @@ INDEX_URL = reverse('horizon:nova:overview:index')
class UsageViewTests(test.BaseAdminViewTests): class UsageViewTests(test.BaseAdminViewTests):
def tearDown(self):
super(UsageViewTests, self).tearDown()
self.reset_times() # override_times is called in the tests
@test.create_stubs({api: ('usage_list',), @test.create_stubs({api: ('usage_list',),
api.keystone: ('tenant_list',)}) api.keystone: ('tenant_list',)})
def test_usage(self): def test_usage(self):
now = self.override_times() now = datetime.datetime.utcnow()
usage_obj = api.nova.Usage(self.usages.first()) usage_obj = api.nova.Usage(self.usages.first())
api.keystone.tenant_list(IsA(http.HttpRequest), admin=True) \ api.keystone.tenant_list(IsA(http.HttpRequest), admin=True) \
.AndReturn(self.tenants.list()) .AndReturn(self.tenants.list())
api.usage_list(IsA(http.HttpRequest), api.usage_list(IsA(http.HttpRequest),
datetime.datetime(now.year, now.month, 1, datetime.datetime(now.year, now.month, 1, 0, 0, 0),
now.hour, now.minute, now.second),
datetime.datetime(now.year, now.month, now.day, now.hour, datetime.datetime(now.year, now.month, now.day, now.hour,
now.minute, now.second)) \ now.minute, now.second)) \
.AndReturn([usage_obj]) .AndReturn([usage_obj])
@ -71,13 +66,12 @@ class UsageViewTests(test.BaseAdminViewTests):
@test.create_stubs({api: ('usage_list',), @test.create_stubs({api: ('usage_list',),
api.keystone: ('tenant_list',)}) api.keystone: ('tenant_list',)})
def test_usage_csv(self): def test_usage_csv(self):
now = self.override_times() now = datetime.datetime.utcnow()
usage_obj = api.nova.Usage(self.usages.first()) usage_obj = api.nova.Usage(self.usages.first())
api.keystone.tenant_list(IsA(http.HttpRequest), admin=True) \ api.keystone.tenant_list(IsA(http.HttpRequest), admin=True) \
.AndReturn(self.tenants.list()) .AndReturn(self.tenants.list())
api.usage_list(IsA(http.HttpRequest), api.usage_list(IsA(http.HttpRequest),
datetime.datetime(now.year, now.month, 1, datetime.datetime(now.year, now.month, 1, 0, 0, 0),
now.hour, now.minute, now.second),
datetime.datetime(now.year, now.month, now.day, now.hour, datetime.datetime(now.year, now.month, now.day, now.hour,
now.minute, now.second)) \ now.minute, now.second)) \
.AndReturn([usage_obj]) .AndReturn([usage_obj])

View File

@ -18,7 +18,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import datetime
import os import os
import cloudfiles as swift_client import cloudfiles as swift_client
@ -41,10 +40,6 @@ from horizon import middleware
from horizon import users from horizon import users
from horizon.tests.test_data.utils import load_test_data from horizon.tests.test_data.utils import load_test_data
from .time import time
from .time import today
from .time import utcnow
# Makes output of failing mox tests much easier to read. # Makes output of failing mox tests much easier to read.
wsgi.WSGIRequest.__repr__ = lambda self: "<class 'django.http.HttpRequest'>" wsgi.WSGIRequest.__repr__ = lambda self: "<class 'django.http.HttpRequest'>"
@ -156,21 +151,6 @@ class TestCase(django_test.TestCase):
authorized_tenants=authorized_tenants, authorized_tenants=authorized_tenants,
request=self.request) request=self.request)
def override_times(self):
""" Overrides the "current" time with immutable values. """
now = datetime.datetime.utcnow()
time.override_time = \
datetime.time(now.hour, now.minute, now.second)
today.override_time = datetime.date(now.year, now.month, now.day)
utcnow.override_time = now
return now
def reset_times(self):
""" Undoes the changes made by ``override_times``. """
time.override_time = None
today.override_time = None
utcnow.override_time = None
def assertRedirectsNoFollow(self, response, expected_url): def assertRedirectsNoFollow(self, response, expected_url):
""" """
Asserts that the given response issued a 302 redirect without Asserts that the given response issued a 302 redirect without

View File

@ -1,28 +0,0 @@
import datetime
def time(hour=0, minute=0, second=0, microsecond=0):
'''Overrideable version of datetime.datetime.today'''
if time.override_time:
return time.override_time
return datetime.time(hour, minute, second, microsecond)
time.override_time = None
def today():
'''Overridable version of datetime.datetime.today'''
if today.override_time:
return today.override_time
return datetime.date.today()
today.override_time = None
def utcnow():
'''Overridable version of datetime.datetime.utcnow'''
if utcnow.override_time:
return utcnow.override_time
return datetime.datetime.utcnow()
utcnow.override_time = None

View File

@ -10,7 +10,6 @@ from django.utils.translation import ugettext as _
from horizon import api from horizon import api
from horizon import exceptions from horizon import exceptions
from horizon import forms from horizon import forms
from horizon import time
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -27,15 +26,15 @@ class BaseUsage(object):
@property @property
def today(self): def today(self):
return time.today() return datetime.date.today()
@staticmethod @staticmethod
def get_datetime(date, now=False): def get_datetime(date, now=False):
if now: if now:
now = time.utcnow() now = datetime.datetime.utcnow()
current_time = time.time(now.hour, now.minute, now.second) current_time = datetime.time(now.hour, now.minute, now.second)
else: else:
current_time = time.time() current_time = datetime.time()
return datetime.datetime.combine(date, current_time) return datetime.datetime.combine(date, current_time)
@staticmethod @staticmethod
@ -46,8 +45,8 @@ class BaseUsage(object):
def get_end(year, month, day=1): def get_end(year, month, day=1):
period = relativedelta(months=1) period = relativedelta(months=1)
date_end = BaseUsage.get_start(year, month, day) + period date_end = BaseUsage.get_start(year, month, day) + period
if date_end > time.today(): if date_end > datetime.date.today():
date_end = time.today() date_end = datetime.date.today()
return date_end return date_end
def get_instances(self): def get_instances(self):
@ -83,7 +82,7 @@ class BaseUsage(object):
raise NotImplementedError("You must define a get_usage method.") raise NotImplementedError("You must define a get_usage method.")
def summarize(self, start, end): def summarize(self, start, end):
if start <= end <= time.today(): if start <= end <= datetime.date.today():
# Convert to datetime.datetime just for API call. # Convert to datetime.datetime just for API call.
start = BaseUsage.get_datetime(start) start = BaseUsage.get_datetime(start)
end = BaseUsage.get_datetime(end, now=True) end = BaseUsage.get_datetime(end, now=True)