def test_add_auto_assigned(): from google.cloud.firestore_v1.types import document from google.cloud.firestore_v1.document import DocumentReference from google.cloud.firestore_v1 import SERVER_TIMESTAMP from google.cloud.firestore_v1._helpers import pbs_for_create from tests.unit.v1 import _test_helpers # Create a minimal fake GAPIC add attach it to a real client. firestore_api = mock.Mock(spec=["create_document", "commit"]) write_result = mock.Mock( update_time=mock.sentinel.update_time, spec=["update_time"] ) commit_response = mock.Mock( write_results=[write_result], spec=["write_results", "commit_time"], commit_time=mock.sentinel.commit_time, ) firestore_api.commit.return_value = commit_response create_doc_response = document.Document() firestore_api.create_document.return_value = create_doc_response client = _test_helpers.make_client() client._firestore_api_internal = firestore_api # Actually make a collection. collection = _make_collection_reference( "grand-parent", "parent", "child", client=client ) # Actually call add() on our collection; include a transform to make # sure transforms during adds work. document_data = {"been": "here", "now": SERVER_TIMESTAMP} patch = mock.patch("google.cloud.firestore_v1.base_collection._auto_id") random_doc_id = "DEADBEEF" with patch as patched: patched.return_value = random_doc_id update_time, document_ref = collection.add(document_data) # Verify the response and the mocks. assert update_time is mock.sentinel.update_time assert isinstance(document_ref, DocumentReference) assert document_ref._client is client expected_path = collection._path + (random_doc_id,) assert document_ref._path == expected_path write_pbs = pbs_for_create(document_ref._document_path, document_data) firestore_api.commit.assert_called_once_with( request={ "database": client._database_string, "writes": write_pbs, "transaction": None, }, metadata=client._rpc_metadata, ) # Since we generate the ID locally, we don't call 'create_document'. firestore_api.create_document.assert_not_called()
def create(self, reference, document_data): """Add a "change" to this batch to create a document. If the document given by ``reference`` already exists, then this batch will fail when :meth:`commit`-ed. Args: reference (~.firestore_v1.document.DocumentReference): A document reference to be created in this batch. document_data (dict): Property names and values to use for creating a document. """ write_pbs = _helpers.pbs_for_create(reference._document_path, document_data) self._add_write_pbs(write_pbs)
def create(self, reference, document_data) -> None: """Add a "change" to this batch to create a document. If the document given by ``reference`` already exists, then this batch will fail when :meth:`commit`-ed. Args: reference (:class:`~google.cloud.firestore_v1.document.DocumentReference`): A document reference to be created in this batch. document_data (dict): Property names and values to use for creating a document. """ write_pbs = _helpers.pbs_for_create(reference._document_path, document_data) self._add_write_pbs(write_pbs)