def test_found(self): from google.cloud.firestore_v1.proto import document_pb2 from google.cloud._helpers import _datetime_to_pb_timestamp from google.cloud.firestore_v1.document import DocumentSnapshot now = datetime.datetime.utcnow() read_time = _datetime_to_pb_timestamp(now) delta = datetime.timedelta(seconds=100) update_time = _datetime_to_pb_timestamp(now - delta) create_time = _datetime_to_pb_timestamp(now - 2 * delta) ref_string = self._dummy_ref_string() document_pb = document_pb2.Document( name=ref_string, fields={ "foo": document_pb2.Value(double_value=1.5), "bar": document_pb2.Value(string_value=u"skillz"), }, create_time=create_time, update_time=update_time, ) response_pb = _make_batch_response(found=document_pb, read_time=read_time) reference_map = {ref_string: mock.sentinel.reference} snapshot = self._call_fut(response_pb, reference_map) self.assertIsInstance(snapshot, DocumentSnapshot) self.assertIs(snapshot._reference, mock.sentinel.reference) self.assertEqual(snapshot._data, {"foo": 1.5, "bar": u"skillz"}) self.assertTrue(snapshot._exists) self.assertEqual(snapshot.read_time, read_time) self.assertEqual(snapshot.create_time, create_time) self.assertEqual(snapshot.update_time, update_time)
def _reference_value(r): return document_pb2.Value(reference_value=r)
def _timestamp_value(seconds, nanos): return document_pb2.Value( timestamp_value=timestamp_pb2.Timestamp(seconds=seconds, nanos=nanos))
def encode_value(value): """Converts a native Python value into a Firestore protobuf ``Value``. Args: value (Union[NoneType, bool, int, float, datetime.datetime, \ str, bytes, dict, ~google.cloud.Firestore.GeoPoint]): A native Python value to convert to a protobuf field. Returns: ~google.cloud.firestore_v1.types.Value: A value encoded as a Firestore protobuf. Raises: TypeError: If the ``value`` is not one of the accepted types. """ if value is None: return document_pb2.Value(null_value=struct_pb2.NULL_VALUE) # Must come before six.integer_types since ``bool`` is an integer subtype. if isinstance(value, bool): return document_pb2.Value(boolean_value=value) if isinstance(value, six.integer_types): return document_pb2.Value(integer_value=value) if isinstance(value, float): return document_pb2.Value(double_value=value) if isinstance(value, DatetimeWithNanoseconds): return document_pb2.Value(timestamp_value=value.timestamp_pb()) if isinstance(value, datetime.datetime): return document_pb2.Value( timestamp_value=_datetime_to_pb_timestamp(value)) if isinstance(value, six.text_type): return document_pb2.Value(string_value=value) if isinstance(value, six.binary_type): return document_pb2.Value(bytes_value=value) # NOTE: We avoid doing an isinstance() check for a Document # here to avoid import cycles. document_path = getattr(value, "_document_path", None) if document_path is not None: return document_pb2.Value(reference_value=document_path) if isinstance(value, GeoPoint): return document_pb2.Value(geo_point_value=value.to_protobuf()) if isinstance(value, list): value_list = [encode_value(element) for element in value] value_pb = document_pb2.ArrayValue(values=value_list) return document_pb2.Value(array_value=value_pb) if isinstance(value, dict): value_dict = encode_dict(value) value_pb = document_pb2.MapValue(fields=value_dict) return document_pb2.Value(map_value=value_pb) raise TypeError("Cannot convert to a Firestore Value", value, "Invalid type", type(value))