haystack/test/testing/test_factory.py

125 lines
3.8 KiB
Python
Raw Permalink Normal View History

# SPDX-FileCopyrightText: 2022-present deepset GmbH <info@deepset.ai>
#
# SPDX-License-Identifier: Apache-2.0
import pytest
2023-11-24 14:48:43 +01:00
from haystack.dataclasses import Document
from haystack.testing.factory import document_store_class, component_class
from haystack.core.component import component
def test_document_store_class_default():
MyStore = document_store_class("MyStore")
store = MyStore()
assert store.count_documents() == 0
assert store.filter_documents() == []
assert store.write_documents([]) is None
assert store.delete_documents([]) is None
2023-11-24 14:48:43 +01:00
assert store.to_dict() == {"type": "haystack.testing.factory.MyStore", "init_parameters": {}}
chore: migrate to `canals==0.7.0` (#5647) * add default_to_dict and default_from_dict placeholders to ease migration to canals 0.7.0 * canals==0.7.0 * whisper components * add to_dict/from_dict stubs * import serialization methods in init to hide canals imports * reno * export deserializationerror too * Update haystack/preview/__init__.py Co-authored-by: Silvano Cerza <3314350+silvanocerza@users.noreply.github.com> * serialization methods for LocalWhisperTranscriber (#5648) * chore: serialization methods for `FileExtensionClassifier` (#5651) * serialization methods for FileExtensionClassifier * Update test_file_classifier.py * chore: serialization methods for `SentenceTransformersDocumentEmbedder` (#5652) * serialization methods for SentenceTransformersDocumentEmbedder * fix device management * serialization methods for SentenceTransformersTextEmbedder (#5653) * serialization methods for TextFileToDocument (#5654) * chore: serialization methods for `RemoteWhisperTranscriber` (#5650) * serialization methods for RemoteWhisperTranscriber * remove patches * Add default to_dict and from_dict in document stores built with factory (#5674) * fix tests (#5671) * chore: simplify serialization methods for `MemoryDocumentStore` (#5667) * simplify serialization for MemoryDocumentStore * remove redundant tests * pylint * chore: serialization methods for `MemoryRetriever` (#5663) * serialization method for MemoryRetriever * more tests * remove hash from default_document_store_to_dict * remove diff in factory.py * chore: serialization methods for `DocumentWriter` (#5661) * serialization methods for DocumentWriter * more tests * use factory * black --------- Co-authored-by: Silvano Cerza <3314350+silvanocerza@users.noreply.github.com>
2023-08-29 18:15:07 +02:00
def test_document_store_from_dict():
MyStore = document_store_class("MyStore")
2023-11-24 14:48:43 +01:00
store = MyStore.from_dict({"type": "haystack.testing.factory.MyStore", "init_parameters": {}})
chore: migrate to `canals==0.7.0` (#5647) * add default_to_dict and default_from_dict placeholders to ease migration to canals 0.7.0 * canals==0.7.0 * whisper components * add to_dict/from_dict stubs * import serialization methods in init to hide canals imports * reno * export deserializationerror too * Update haystack/preview/__init__.py Co-authored-by: Silvano Cerza <3314350+silvanocerza@users.noreply.github.com> * serialization methods for LocalWhisperTranscriber (#5648) * chore: serialization methods for `FileExtensionClassifier` (#5651) * serialization methods for FileExtensionClassifier * Update test_file_classifier.py * chore: serialization methods for `SentenceTransformersDocumentEmbedder` (#5652) * serialization methods for SentenceTransformersDocumentEmbedder * fix device management * serialization methods for SentenceTransformersTextEmbedder (#5653) * serialization methods for TextFileToDocument (#5654) * chore: serialization methods for `RemoteWhisperTranscriber` (#5650) * serialization methods for RemoteWhisperTranscriber * remove patches * Add default to_dict and from_dict in document stores built with factory (#5674) * fix tests (#5671) * chore: simplify serialization methods for `MemoryDocumentStore` (#5667) * simplify serialization for MemoryDocumentStore * remove redundant tests * pylint * chore: serialization methods for `MemoryRetriever` (#5663) * serialization method for MemoryRetriever * more tests * remove hash from default_document_store_to_dict * remove diff in factory.py * chore: serialization methods for `DocumentWriter` (#5661) * serialization methods for DocumentWriter * more tests * use factory * black --------- Co-authored-by: Silvano Cerza <3314350+silvanocerza@users.noreply.github.com>
2023-08-29 18:15:07 +02:00
assert isinstance(store, MyStore)
def test_document_store_class_with_documents():
doc = Document(id="fake_id", content="This is a document")
MyStore = document_store_class("MyStore", documents=[doc])
store = MyStore()
assert store.count_documents() == 1
assert store.filter_documents() == [doc]
def test_document_store_class_with_documents_count():
MyStore = document_store_class("MyStore", documents_count=100)
store = MyStore()
assert store.count_documents() == 100
assert store.filter_documents() == []
def test_document_store_class_with_documents_and_documents_count():
doc = Document(id="fake_id", content="This is a document")
MyStore = document_store_class("MyStore", documents=[doc], documents_count=100)
store = MyStore()
assert store.count_documents() == 100
assert store.filter_documents() == [doc]
def test_document_store_class_with_bases():
MyStore = document_store_class("MyStore", bases=(Exception,))
store = MyStore()
assert isinstance(store, Exception)
def test_document_store_class_with_extra_fields():
MyStore = document_store_class("MyStore", extra_fields={"my_field": 10})
store = MyStore()
assert store.my_field == 10 # type: ignore
def test_component_class_default():
MyComponent = component_class("MyComponent")
comp = MyComponent()
res = comp.run(value=1)
assert res == {"value": None}
res = comp.run(value="something")
assert res == {"value": None}
res = comp.run(non_existing_input=1)
assert res == {"value": None}
def test_component_class_is_registered():
MyComponent = component_class("MyComponent")
assert component.registry["haystack.testing.factory.MyComponent"] == MyComponent
def test_component_class_with_input_types():
MyComponent = component_class("MyComponent", input_types={"value": int})
comp = MyComponent()
res = comp.run(value=1)
assert res == {"value": None}
res = comp.run(value="something")
assert res == {"value": None}
def test_component_class_with_output_types():
MyComponent = component_class("MyComponent", output_types={"value": int})
comp = MyComponent()
res = comp.run(value=1)
assert res == {"value": None}
def test_component_class_with_output():
MyComponent = component_class("MyComponent", output={"value": 100})
comp = MyComponent()
res = comp.run(value=1)
assert res == {"value": 100}
def test_component_class_with_output_and_output_types():
MyComponent = component_class("MyComponent", output_types={"value": str}, output={"value": 100})
comp = MyComponent()
res = comp.run(value=1)
assert res == {"value": 100}
def test_component_class_with_bases():
MyComponent = component_class("MyComponent", bases=(Exception,))
comp = MyComponent()
assert isinstance(comp, Exception)
def test_component_class_with_extra_fields():
MyComponent = component_class("MyComponent", extra_fields={"my_field": 10})
comp = MyComponent()
assert comp.my_field == 10 # type: ignore