Skip to content

Commit 7067874

Browse files
committed
Various tests #2
1 parent dc175e1 commit 7067874

27 files changed

+939
-8
lines changed

ravendb/documents/commands/revisions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def get_request_query_string(self, path_builder: List[str]) -> None:
9292
path_builder.append(Utils.escape(change_vector))
9393

9494
if self._before is not None:
95-
path_builder.append("&before")
95+
path_builder.append("&before=")
9696
path_builder.append(Utils.datetime_to_string(self._before))
9797

9898
if self._start is not None:

ravendb/documents/indexes/abstract_index_creation_tasks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from ravendb.documents.indexes.vector.options import VectorOptions
2323
from ravendb.documents.operations.indexes import PutIndexesOperation
2424
from ravendb.documents.store.definition import DocumentStoreBase
25+
from ravendb.exceptions.raven_exceptions import IndexCompilationException
2526
from ravendb.primitives import constants
2627

2728
_T_IndexDefinition = TypeVar("_T_IndexDefinition", bound=IndexDefinition)
@@ -268,7 +269,7 @@ def __set_suggestions(options: IndexFieldOptions, value: bool):
268269
return index_definition
269270

270271
except Exception as e:
271-
raise RuntimeError(f"Failed to create index {self._index_name}", e) # todo: IndexCompilationException
272+
raise IndexCompilationException(f"Failed to create index {self._index_name}", e)
272273

273274

274275
class IndexDefinitionBuilder(AbstractIndexDefinitionBuilder[IndexDefinition]):

ravendb/documents/session/document_session_operations/in_memory_document_session_operations.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1887,7 +1887,7 @@ def with_timeout(self, timeout: datetime.timedelta) -> InMemoryDocumentSessionOp
18871887
return self
18881888

18891889
def throw_on_timeout(self, should_throw: bool) -> InMemoryDocumentSessionOperations.IndexesWaitOptsBuilder:
1890-
self.get_options().index_options.throw_on_timeout_in_wait_for_replicas = should_throw
1890+
self.get_options().index_options.throw_on_timeout_in_wait_for_indexes = should_throw
18911891
return self
18921892

18931893
def wait_for_indexes(self, *indexes: str) -> InMemoryDocumentSessionOperations.IndexesWaitOptsBuilder:

ravendb/documents/session/misc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
if TYPE_CHECKING:
1212
from ravendb.http.request_executor import RequestExecutor
13-
from ravendb.documents.queries.misc import Query
13+
from ravendb.documents.session.query import DocumentQuery
1414
from ravendb.documents.session.operations.query import QueryOperation
1515
from ravendb.documents.session.document_session_operations.in_memory_document_session_operations import (
1616
InMemoryDocumentSessionOperations,
@@ -153,7 +153,7 @@ def __init__(
153153

154154

155155
class DocumentQueryCustomization:
156-
def __init__(self, query: Query):
156+
def __init__(self, query: DocumentQuery):
157157
self.query = query
158158
self.query_operation: QueryOperation = None
159159

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from pathlib import Path
2+
3+
from ravendb.documents.smuggler.periodic_backup_file_extension_comparator import PeriodicBackupFileExtensionComparator
4+
5+
6+
class BackupUtils:
7+
8+
@staticmethod
9+
def file_comparator(file1: Path, file2: Path) -> int:
10+
base_name1 = file1.stem
11+
base_name2 = file2.stem
12+
13+
if base_name1 != base_name2:
14+
return (base_name1 > base_name2) - (base_name1 < base_name2)
15+
16+
ext1 = file1.suffix[1:] if file1.suffix.startswith('.') else file1.suffix
17+
ext2 = file2.suffix[1:] if file2.suffix.startswith('.') else file2.suffix
18+
19+
if ext1 != ext2:
20+
return PeriodicBackupFileExtensionComparator.compare(file1, file2)
21+
22+
last_modified1 = file1.stat().st_mtime
23+
last_modified2 = file2.stat().st_mtime
24+
25+
return (last_modified1 > last_modified2) - (last_modified1 < last_modified2)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from pathlib import Path
2+
3+
from ravendb.primitives.constants import PeriodicBackup
4+
5+
class PeriodicBackupFileExtensionComparator:
6+
7+
@staticmethod
8+
def compare(file1: Path, file2: Path) -> int:
9+
if file1.resolve() == file2.resolve():
10+
return 0
11+
12+
ext1 = file1.suffix[1:].lower() if file1.suffix.startswith('.') else file1.suffix.lower()
13+
14+
if ext1 == PeriodicBackup.SNAPSHOT_EXTENSION:
15+
return -1
16+
17+
if ext1 == PeriodicBackup.FULL_BACKUP_EXTENSION:
18+
return -1
19+
20+
return 1

ravendb/documents/subscriptions/document_subscriptions.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ def create_for_class(
7373
options = options or SubscriptionCreationOptions()
7474
return self.create_for_options(self.ensure_criteria(options, object_type, False), database)
7575

76+
def create_for_revisions(
77+
self,
78+
object_type: Type[_T],
79+
options: Optional[SubscriptionCreationOptions] = None,
80+
database: Optional[str] = None,
81+
) -> str:
82+
options = options or SubscriptionCreationOptions()
83+
return self.create_for_options(self.ensure_criteria(options, object_type, True), database)
84+
7685
def ensure_criteria(self, criteria: SubscriptionCreationOptions, object_type: Type[_T], revisions: bool):
7786
if criteria is None:
7887
criteria = SubscriptionCreationOptions()

ravendb/primitives/constants.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,16 @@ def configuration_to_method_name(source: VectorEmbeddingType, dest: VectorEmbedd
114114

115115
DEFAULT_EMBEDDING_TYPE = VectorEmbeddingType.SINGLE
116116
DEFAULT_IS_EXACT = False
117+
118+
class PeriodicBackup:
119+
FULL_BACKUP_EXTENSION = "ravendb-full-backup"
120+
SNAPSHOT_EXTENSION = "ravendb-snapshot"
121+
ENCRYPTED_FULL_BACKUP_EXTENSION = ".ravendb-encrypted-full-backup"
122+
ENCRYPTED_SNAPSHOT_EXTENSION = ".ravendb-encrypted-snapshot"
123+
INCREMENTAL_BACKUP_EXTENSION = "ravendb-incremental-backup"
124+
ENCRYPTED_INCREMENTAL_BACKUP_EXTENSION = ".ravendb-encrypted-incremental-backup"
125+
126+
class Folders:
127+
INDEXES = "Indexes"
128+
DOCUMENTS = "Documents"
129+
CONFIGURATION = "Configuration"

ravendb/tests/jvm_migrated_tests/bugs_tests/caching_tests/test_caching_of_document_include.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@ class CachingOfDocumentsIncludeTest(TestBase):
2828
def setUp(self):
2929
super().setUp()
3030

31+
def test_can_cache_document_with_includes(self):
32+
with self.store.open_session() as session:
33+
user = User(name="Ayende")
34+
session.store(user)
35+
36+
partner = User(partner_id="users/1-A")
37+
session.store(partner)
38+
39+
session.save_changes()
40+
41+
with self.store.open_session() as session:
42+
session.include("partnerId").load("users/2-A", User)
43+
session.save_changes()
44+
45+
with self.store.open_session() as session:
46+
session.include("partnerId").load("users/2-A", User)
47+
self.assertEqual(len(session.advanced.request_executor.cache), 1)
48+
3149
def test_can_avoid_using_server_for_load_with_include_if_everything_is_in_session_cacheLazy(self):
3250
with self.store.open_session() as session:
3351
user = User(name="Ayende")
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from ravendb.documents.subscriptions.revision import Revision
2+
3+
from ravendb.documents.subscriptions.worker import SubscriptionBatch
4+
5+
from ravendb.documents.subscriptions.options import SubscriptionWorkerOptions
6+
7+
from ravendb.documents.operations.revisions import RevisionsCollectionConfiguration, RevisionsConfiguration, \
8+
ConfigureRevisionsOperation
9+
10+
from ravendb.tests.test_base import TestBase, User, Company
11+
12+
import threading
13+
14+
15+
class TestRevisionsSubscriptions(TestBase):
16+
def setUp(self):
17+
super(TestRevisionsSubscriptions, self).setUp()
18+
19+
def test_plain_revisions_subscriptions_compare_docs(self):
20+
subscription_id = self.store.subscriptions.create_for_revisions(object_type=User)
21+
22+
default_collection = RevisionsCollectionConfiguration(minimum_revisions_to_keep=5)
23+
users_config = RevisionsCollectionConfiguration()
24+
dons_config = RevisionsCollectionConfiguration()
25+
26+
per_collection_config = { "Users": users_config, "Dons": dons_config }
27+
configuration = RevisionsConfiguration(default_collection, per_collection_config)
28+
29+
operation = ConfigureRevisionsOperation(configuration)
30+
self.store.maintenance.send(operation)
31+
32+
for i in range(10):
33+
with self.store.open_session() as session:
34+
user = User(f"users1 ver {i}", i)
35+
session.store(user)
36+
37+
company = Company(name=f"dons1 ver {i}")
38+
session.store(company)
39+
40+
session.save_changes()
41+
42+
sub = self.store.subscriptions.get_subscription_worker_for_revisions(SubscriptionWorkerOptions(subscription_id), object_type=User)
43+
44+
mre = threading.Semaphore(0)
45+
names = []
46+
max_age = -1
47+
48+
def process_batch(batch: SubscriptionBatch):
49+
nonlocal mre, names, max_age
50+
51+
for item in batch.items:
52+
item: SubscriptionBatch.Item[Revision[User]]
53+
x = item.result
54+
55+
if x.current.age > max_age and x.current.age > (x.previous.age if x.previous is not None else -1):
56+
current_name = x.current.name if x.current is not None else None
57+
previous_name = x.previous.name if x.previous is not None else None
58+
names.append(f"{current_name} + {previous_name}")
59+
max_age = x.current.age
60+
61+
if len(names) == 10:
62+
mre.release()
63+
64+
# todo kuba: RuntimeError: dictionary changed size during iteration
65+
# todo kuba: TypeError: 'NoneType' object does not support the context manager protocol
66+
sub.run(process_batch)
67+
68+
self.assertTrue(mre.acquire(timeout=15))

0 commit comments

Comments
 (0)