def test_time_add(self): time = "1970-01-25T02:00:00Z" q1 = query.time_add(query.epoch(1, "hour"), 577, "hour") q2 = query.time_add(query.epoch(2, "hour"), 24, "days") self.assertIsInstance(self._q(q1), FaunaTime) self.assertEqual(self._q(q1), FaunaTime(time)) self.assertIsInstance(self._q(q2), FaunaTime) self.assertEqual(self._q(q2), FaunaTime(time))
def test_time_subtract(self): time = "1970-01-01T00:00:00Z" qry1 = query.time_subtract(query.epoch(1, "hour"), 1, "hour") qry2 = query.time_subtract(query.epoch(1, "day"), 24, "hour") self.assertIsInstance(self._q(qry1), FaunaTime) self.assertEqual(self._q(qry1), FaunaTime(time)) self.assertIsInstance(self._q(qry2), FaunaTime) self.assertEqual(self._q(qry2), FaunaTime(time))
def test_time(self): test_ts = FaunaTime("1970-01-01T00:00:00.123456789Z") test_ts_json = '{"@ts":"1970-01-01T00:00:00.123456789Z"}' self.assertJson(test_ts, test_ts_json) self.assertToJson(datetime.fromtimestamp(0, iso8601.UTC), '{"@ts":"1970-01-01T00:00:00Z"}') self.assertEqual(repr(test_ts), "FaunaTime('1970-01-01T00:00:00.123456789Z')") self.assertNotEqual(test_ts, FaunaTime("some_other_time"))
def _parse_json_hook(dct): #pylint: disable=too-many-return-statements """ Looks for FaunaDB types in a JSON object and converts to them if possible. """ if "@ref" in dct: ref = dct["@ref"] if (not "collection" in ref) and (not "database" in ref): return Native.from_name(ref["id"]) return Ref(ref["id"], ref.get("collection"), ref.get("database")) if "@obj" in dct: return dct["@obj"] if "@set" in dct: return SetRef(dct["@set"]) if "@query" in dct: return Query(dct["@query"]) if "@ts" in dct: return FaunaTime(dct["@ts"]) if "@date" in dct: return parse_date(dct["@date"]).date() if "@bytes" in dct: return bytearray(urlsafe_b64decode(dct["@bytes"].encode())) return dct
def test_complex_object(self): self.maxDiff = None json = """{ "ref": {"@ref":{"collection":{"@ref":{"id":"collections"}},"id":"widget"}}, "set_ref": {"@set":{"match":{"@ref":{"collection":{"@ref":{"id":"collections"}},"id":"widget"}},"terms":"Laptop"}}, "date": {"@date":"1970-01-01"}, "time": {"@ts":"1970-01-01T00:00:00.123456789Z"}, "object": {"@obj":{"key":"value"}}, "array": [1, 2], "string": "a string", "number": 1 }""" self.assertJson( json, { "ref": Ref("widget", Native.COLLECTIONS), "set_ref": SetRef({ "match": Ref("widget", Native.COLLECTIONS), "terms": "Laptop" }), "date": parse_date("1970-01-01").date(), "time": FaunaTime("1970-01-01T00:00:00.123456789Z"), "object": { "key": "value" }, "array": [1, 2], "string": "a string", "number": 1 })
def default(self, obj): if isinstance(obj, _Expr): return obj.to_fauna_json() elif isinstance(obj, datetime): return FaunaTime(obj).to_fauna_json() elif isinstance(obj, date): return {"@date": obj.isoformat()} elif isinstance(obj, (bytes, bytearray)): return {"@bytes": urlsafe_b64encode(obj).decode('utf-8')} else: raise UnexpectedError( "Unserializable object {} of type {}".format(obj, type(obj)), None)
def test_time_conversion(self): dt = datetime.now(iso8601.UTC) self.assertEqual(FaunaTime(dt).to_datetime(), dt) # Must be time zone aware. self.assertRaises(ValueError, lambda: FaunaTime(datetime.utcnow())) dt = datetime.fromtimestamp(0, iso8601.UTC) ft = FaunaTime(dt) self.assertEqual(ft, FaunaTime("1970-01-01T00:00:00Z")) self.assertEqual(ft.to_datetime(), dt)
def from_fauna_time(fauna_time: FaunaTime) -> datetime: tz = timezone(settings.TIMEZONE) return fauna_time.to_datetime().astimezone(tz)
def test_fauna_time(self): self.assertJson(FaunaTime('1970-01-01T00:00:00.123456789Z'), '{"@ts":"1970-01-01T00:00:00.123456789Z"}') self.assertJson(datetime.fromtimestamp(0, iso8601.UTC), '{"@ts":"1970-01-01T00:00:00Z"}')
def test_epoch(self): self.assertEqual(self._q(query.epoch(12, "second")), FaunaTime("1970-01-01T00:00:12Z")) nano_time = FaunaTime("1970-01-01T00:00:00.123456789Z") self.assertEqual(self._q(query.epoch(123456789, "nanosecond")), nano_time)
def test_time(self): time = "1970-01-01T00:00:00.123456789Z" self.assertEqual(self._q(query.time(time)), FaunaTime(time)) # "now" refers to the current time. self.assertIsInstance(self._q(query.time("now")), FaunaTime)
def test_to_time(self): time = "1970-01-01T00:00:00Z" self.assertEqual(self._q(query.to_time(time)), FaunaTime(time))
def test_fauna_time(self): self.assertJson('{"@ts":"1970-01-01T00:00:00.123456789Z"}', FaunaTime('1970-01-01T00:00:00.123456789Z'))