Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion gel/_internal/_save.py
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,16 @@ def make_plan(
# `__gel_get_changed_fields__()`, se we process them
# separately).

assert val is None or isinstance(val, GelModel)
if val is None:
sch = SingleLinkChange(
name=prop.name,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't change this in this PR, but prop ought to be called ptr

info=prop,
target=None,
)
push_change(requireds, sched, sch)
continue

assert isinstance(val, GelModel)
assert not prop.cardinality.is_multi()

link_prop_variant = False
Expand Down
177 changes: 69 additions & 108 deletions tests/test_model_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -2592,6 +2592,7 @@ def _testcase(
_testcase(default.Source, None)
_testcase(default.Source, target)

_testcase(default.SourceWithProp, None)
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target),
Expand All @@ -2601,55 +2602,46 @@ def _testcase(
default.SourceWithProp.target.link(target, lprop=1),
)

@tb.xfail
def test_model_sync_single_link_01a(self):
# Asserting error in _save
from models.TestModelSyncSingleLink import default

with_none = default.SourceWithProp(target=None)
self.client.sync(with_none)

def _testcase_02(
self,
model_type: typing.Type[GelModel],
initial_target: typing.Any,
changed_target: typing.Any,
) -> None:
original = model_type(target=initial_target)
self.client.save(original)
def test_model_sync_single_link_02(self):
# Updating existing objects with single link

mirror_1 = self.client.query_required_single(
model_type.select(target=True).limit(1)
)
mirror_2 = self.client.query_required_single(
model_type.select(target=True).limit(1)
)
mirror_3 = self.client.query_required_single(
model_type.select(target=False).limit(1)
)
def _testcase(
model_type: typing.Type[GelModel],
initial_target: typing.Any,
changed_target: typing.Any,
) -> None:
original = model_type(target=initial_target)
self.client.save(original)

self._check_links_equal(original.target, initial_target)
self._check_links_equal(mirror_1.target, initial_target)
self._check_links_equal(mirror_2.target, initial_target)
self.assertFalse(hasattr(mirror_3, "val"))
mirror_1 = self.client.query_required_single(
model_type.select(target=True).limit(1)
)
mirror_2 = self.client.query_required_single(
model_type.select(target=True).limit(1)
)
mirror_3 = self.client.query_required_single(
model_type.select(target=False).limit(1)
)

# change a value
original.target = changed_target
self._check_links_equal(original.target, initial_target)
self._check_links_equal(mirror_1.target, initial_target)
self._check_links_equal(mirror_2.target, initial_target)
self.assertFalse(hasattr(mirror_3, "val"))

# sync some of the objects
self.client.sync(original, mirror_1, mirror_3)
# change a value
original.target = changed_target

# only synced objects with value set get update
self._check_links_equal(original.target, changed_target)
self._check_links_equal(mirror_1.target, changed_target)
self._check_links_equal(mirror_2.target, initial_target)
self.assertFalse(hasattr(mirror_3, 'val'))
# sync some of the objects
self.client.sync(original, mirror_1, mirror_3)

# cleanup
self.client.query(model_type.delete())
# only synced objects with value set get update
self._check_links_equal(original.target, changed_target)
self._check_links_equal(mirror_1.target, changed_target)
self._check_links_equal(mirror_2.target, initial_target)
self.assertFalse(hasattr(mirror_3, 'val'))

def test_model_sync_single_link_02(self):
# Updating existing objects with single link
# cleanup
self.client.query(model_type.delete())

from models.TestModelSyncSingleLink import default

Expand All @@ -2658,116 +2650,85 @@ def test_model_sync_single_link_02(self):
self.client.save(target_a, target_b)

# Change to/from None
self._testcase_02(default.Source, None, target_b)
self._testcase_02(default.Source, target_a, None)
self._testcase_02(default.Source, target_a, target_b)
_testcase(default.Source, None, target_b)
_testcase(default.Source, target_a, None)

# Moved to test_model_sync_single_link_02c
# self._testcase_02(
# default.SourceWithProp,
# None,
# default.SourceWithProp.target.link(target_b),
# )
# self._testcase_02(
# default.SourceWithProp,
# None,
# default.SourceWithProp.target.link(target_b, lprop=1),
# )
# self._testcase_02(
# default.SourceWithProp,
# default.SourceWithProp.target.link(target_a),
# None,
# )
# self._testcase_02(
# default.SourceWithProp,
# default.SourceWithProp.target.link(target_a, lprop=1),
# None,
# )
_testcase(
default.SourceWithProp,
None,
default.SourceWithProp.target.link(target_b),
)
_testcase(
default.SourceWithProp,
None,
default.SourceWithProp.target.link(target_b, lprop=1),
)
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a),
None,
)
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a, lprop=1),
None,
)

# Change to a new value
self._testcase_02(
_testcase(default.Source, target_a, target_b)

_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a),
default.SourceWithProp.target.link(target_b),
)
self._testcase_02(
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a, lprop=1),
default.SourceWithProp.target.link(target_b),
)
self._testcase_02(
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a),
default.SourceWithProp.target.link(target_b, lprop=1),
)
self._testcase_02(
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a, lprop=1),
default.SourceWithProp.target.link(target_b, lprop=1),
)

# only changing lprop
self._testcase_02(
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a),
default.SourceWithProp.target.link(target_a, lprop=2),
)
self._testcase_02(
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a, lprop=1),
default.SourceWithProp.target.link(target_a),
)
self._testcase_02(
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a, lprop=1),
default.SourceWithProp.target.link(target_a, lprop=2),
)

# Change to the same value
self._testcase_02(default.Source, None, None)
self._testcase_02(default.Source, target_a, target_a)
self._testcase_02(
_testcase(default.Source, None, None)
_testcase(default.Source, target_a, target_a)
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a),
default.SourceWithProp.target.link(target_a),
)
self._testcase_02(
_testcase(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a, lprop=1),
default.SourceWithProp.target.link(target_a, lprop=1),
)

@tb.xfail # Changing links with props to/from None fails assertion
def test_model_sync_single_link_02c(self):
# Updating existing objects with single link

from models.TestModelSyncSingleLink import default

target_a = default.Target()
target_b = default.Target()
self.client.save(target_a, target_b)

self._testcase_02(
default.SourceWithProp,
None,
default.SourceWithProp.target.link(target_b),
)
self._testcase_02(
default.SourceWithProp,
None,
default.SourceWithProp.target.link(target_b, lprop=1),
)
self._testcase_02(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a),
None,
)
self._testcase_02(
default.SourceWithProp,
default.SourceWithProp.target.link(target_a, lprop=1),
None,
)

def _testcase_03(
self,
model_type: typing.Type[GelModel],
Expand Down
Loading