diff --git a/LowVoltage/operations/admin_operations.py b/LowVoltage/operations/admin_operations.py index bcf6faa..07d0f29 100644 --- a/LowVoltage/operations/admin_operations.py +++ b/LowVoltage/operations/admin_operations.py @@ -2,6 +2,7 @@ # Copyright 2013-2014 Vincent Jacques +import datetime import unittest from LowVoltage.operations.operation import Operation as _Operation, OperationProxy as _OperationProxy @@ -415,6 +416,7 @@ def testSimplestTable(self): ) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table_description.creation_date_time) self.assertEqual(r.table_description.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table_description.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table_description.global_secondary_indexes, None) @@ -422,8 +424,8 @@ def testSimplestTable(self): self.assertEqual(r.table_description.key_schema[0].attribute_name, "h") self.assertEqual(r.table_description.key_schema[0].key_type, "HASH") self.assertEqual(r.table_description.local_secondary_indexes, None) - self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table_description.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table_description.provisioned_throughput.read_capacity_units, 1) self.assertEqual(r.table_description.provisioned_throughput.write_capacity_units, 2) @@ -443,6 +445,7 @@ def testSimpleGlobalSecondaryIndex(self): _fix_order_for_tests(r.table_description) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table_description.creation_date_time) self.assertEqual(r.table_description.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table_description.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table_description.attribute_definitions[1].attribute_name, "hh") @@ -464,8 +467,8 @@ def testSimpleGlobalSecondaryIndex(self): self.assertEqual(r.table_description.key_schema[0].attribute_name, "h") self.assertEqual(r.table_description.key_schema[0].key_type, "HASH") self.assertEqual(r.table_description.local_secondary_indexes, None) - self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table_description.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table_description.provisioned_throughput.read_capacity_units, 1) self.assertEqual(r.table_description.provisioned_throughput.write_capacity_units, 2) @@ -482,6 +485,7 @@ def testSimpleLocalSecondaryIndex(self): _fix_order_for_tests(r.table_description) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table_description.creation_date_time) self.assertEqual(r.table_description.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table_description.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table_description.attribute_definitions[1].attribute_name, "r") @@ -504,8 +508,8 @@ def testSimpleLocalSecondaryIndex(self): self.assertEqual(r.table_description.local_secondary_indexes[0].key_schema[1].key_type, "RANGE") self.assertEqual(r.table_description.local_secondary_indexes[0].projection.non_key_attributes, None) self.assertEqual(r.table_description.local_secondary_indexes[0].projection.projection_type, "ALL") - self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table_description.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table_description.provisioned_throughput.read_capacity_units, 1) self.assertEqual(r.table_description.provisioned_throughput.write_capacity_units, 2) @@ -525,6 +529,7 @@ def testGlobalSecondaryIndexWithProjection(self): _fix_order_for_tests(r.table_description) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table_description.creation_date_time) self.assertEqual(r.table_description.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table_description.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table_description.attribute_definitions[1].attribute_name, "hh") @@ -547,8 +552,8 @@ def testGlobalSecondaryIndexWithProjection(self): self.assertEqual(r.table_description.key_schema[0].attribute_name, "h") self.assertEqual(r.table_description.key_schema[0].key_type, "HASH") self.assertEqual(r.table_description.local_secondary_indexes, None) - self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table_description.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table_description.provisioned_throughput.read_capacity_units, 1) self.assertEqual(r.table_description.provisioned_throughput.write_capacity_units, 2) @@ -639,6 +644,7 @@ def test(self): r = self.connection.request(DeleteTable("Aaa")) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table_description.creation_date_time) self.assertEqual(r.table_description.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table_description.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table_description.global_secondary_indexes, None) @@ -646,8 +652,8 @@ def test(self): self.assertEqual(r.table_description.key_schema[0].attribute_name, "h") self.assertEqual(r.table_description.key_schema[0].key_type, "HASH") self.assertEqual(r.table_description.local_secondary_indexes, None) - self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table_description.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table_description.provisioned_throughput.read_capacity_units, 1) self.assertEqual(r.table_description.provisioned_throughput.write_capacity_units, 2) @@ -698,6 +704,7 @@ def test(self): r = self.connection.request(DescribeTable("Aaa")) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table.creation_date_time) self.assertEqual(r.table.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table.global_secondary_indexes, None) @@ -705,8 +712,8 @@ def test(self): self.assertEqual(r.table.key_schema[0].attribute_name, "h") self.assertEqual(r.table.key_schema[0].key_type, "HASH") self.assertEqual(r.table.local_secondary_indexes, None) - self.assertEqual(r.table.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table.provisioned_throughput.read_capacity_units, 1) self.assertEqual(r.table.provisioned_throughput.write_capacity_units, 2) @@ -946,6 +953,7 @@ def testThroughput(self): _fix_order_for_tests(r.table_description) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table_description.creation_date_time) self.assertEqual(r.table_description.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table_description.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table_description.attribute_definitions[1].attribute_name, "hh") @@ -967,8 +975,8 @@ def testThroughput(self): self.assertEqual(r.table_description.key_schema[0].attribute_name, "h") self.assertEqual(r.table_description.key_schema[0].key_type, "HASH") self.assertEqual(r.table_description.local_secondary_indexes, None) - self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table_description.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table_description.provisioned_throughput.read_capacity_units, 2) self.assertEqual(r.table_description.provisioned_throughput.write_capacity_units, 4) @@ -984,6 +992,7 @@ def testGsiprovisioned_Throughput(self): _fix_order_for_tests(r.table_description) with cover("r", r) as r: + self.assertDateTimeIsReasonable(r.table_description.creation_date_time) self.assertEqual(r.table_description.attribute_definitions[0].attribute_name, "h") self.assertEqual(r.table_description.attribute_definitions[0].attribute_type, "S") self.assertEqual(r.table_description.attribute_definitions[1].attribute_name, "hh") @@ -1005,8 +1014,8 @@ def testGsiprovisioned_Throughput(self): self.assertEqual(r.table_description.key_schema[0].attribute_name, "h") self.assertEqual(r.table_description.key_schema[0].key_type, "HASH") self.assertEqual(r.table_description.local_secondary_indexes, None) - self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, 0.) - self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, 0.) + self.assertEqual(r.table_description.provisioned_throughput.last_decrease_date_time, datetime.datetime(1970, 1, 1)) + self.assertEqual(r.table_description.provisioned_throughput.last_increase_date_time, datetime.datetime(1970, 1, 1)) self.assertEqual(r.table_description.provisioned_throughput.number_of_decreases_today, 0) self.assertEqual(r.table_description.provisioned_throughput.read_capacity_units, 1) self.assertEqual(r.table_description.provisioned_throughput.write_capacity_units, 2) diff --git a/LowVoltage/return_types.py b/LowVoltage/return_types.py index 00fac11..7963f57 100644 --- a/LowVoltage/return_types.py +++ b/LowVoltage/return_types.py @@ -2,6 +2,8 @@ # Copyright 2013-2014 Vincent Jacques +import datetime + from LowVoltage.operations.conversion import _convert_dict_to_db, _convert_value_to_db, _convert_db_to_dict, _convert_db_to_value @@ -22,7 +24,7 @@ def __init__( ): # http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TableDescription.html self.attribute_definitions = None if AttributeDefinitions is None else [AttributeDefinition(**d) for d in AttributeDefinitions] - # self.creation_date_time = CreationDateTime # @todo datetime + self.creation_date_time = None if CreationDateTime is None else datetime.datetime.utcfromtimestamp(CreationDateTime) self.global_secondary_indexes = None if GlobalSecondaryIndexes is None else [GlobalSecondaryIndexDescription(**d) for d in GlobalSecondaryIndexes] self.item_count = None if ItemCount is None else long(ItemCount) self.key_schema = None if KeySchema is None else [KeySchemaElement(**e) for e in KeySchema] @@ -90,8 +92,8 @@ def __init__( **dummy ): # http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughputDescription.html - self.last_decrease_date_time = LastDecreaseDateTime # @todo datetime - self.last_increase_date_time = LastIncreaseDateTime # @todo datetime + self.last_decrease_date_time = None if LastDecreaseDateTime is None else datetime.datetime.utcfromtimestamp(LastDecreaseDateTime) + self.last_increase_date_time = None if LastIncreaseDateTime is None else datetime.datetime.utcfromtimestamp(LastIncreaseDateTime) self.number_of_decreases_today = NumberOfDecreasesToday self.read_capacity_units = ReadCapacityUnits self.write_capacity_units = WriteCapacityUnits diff --git a/LowVoltage/tests/cover.py b/LowVoltage/tests/cover.py index 0b1ebc8..67ab071 100644 --- a/LowVoltage/tests/cover.py +++ b/LowVoltage/tests/cover.py @@ -3,6 +3,7 @@ # Copyright 2013-2014 Vincent Jacques import collections +import datetime import numbers import unittest @@ -70,7 +71,7 @@ def __getitem__(self, index): def cover(prefix, anything): - if isinstance(anything, (bool, numbers.Number, basestring, type(None), dict)): + if isinstance(anything, (bool, numbers.Number, basestring, type(None), dict, datetime.datetime)): return anything elif isinstance(anything, list): return CoverList(prefix, anything) diff --git a/LowVoltage/tests/dynamodb_local.py b/LowVoltage/tests/dynamodb_local.py index d9ad037..48ed63a 100644 --- a/LowVoltage/tests/dynamodb_local.py +++ b/LowVoltage/tests/dynamodb_local.py @@ -2,6 +2,7 @@ # Copyright 2013-2014 Vincent Jacques +import datetime import glob import io import os @@ -51,10 +52,17 @@ def __exit__(self, *dummy): class TestCase(unittest.TestCase): + before_start = datetime.datetime.utcnow() + after_end = before_start + datetime.timedelta(minutes=10) + @classmethod def setUpClass(cls): cls.connection = LowVoltage.Connection("us-west-2", LowVoltage.StaticCredentials("DummyKey", "DummySecret"), "http://localhost:65432/") + def assertDateTimeIsReasonable(self, t): + self.assertGreaterEqual(t, self.before_start) + self.assertLessEqual(t, self.after_end) + def main(*args, **kwds): # pragma no cover (Test code) with DynamoDbLocal():