Skip to content
Snippets Groups Projects

ENH: F remove value or property

Merged Florian Spreckelsen requested to merge f-remove-value-or-property into dev
All threads resolved!
1 file
+ 12
3
Compare changes
  • Side-by-side
  • Inline
+ 86
4
# -*- encoding: utf-8 -*-
#
# ** header v3.0
# This file is a part of the CaosDB Project.
#
# Copyright (C) 2018 Research Group Biomedical Physics,
# Max-Planck-Institute for Dynamics and Self-Organization Göttingen
# Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
# Copyright (C) 2020 - 2023 IndiScale GmbH <info@indiscale.com>
# Copyright (C) 2023 Florian Spreckelsen <f.spreckelsen@indiscale.com>
# Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
#
# This program is free software: you can redistribute it and/or modify
@@ -21,8 +21,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# ** end header
#
"""Tests for the Property class."""
import os
@@ -138,3 +136,87 @@ def test_is_reference():
# restore retrieve function with original
Entity.retrieve = real_retrieve
def test_remove_value_from_property():
rec = Record()
names_values_dtypes = [
("testListProp1", [1, 2, 3], db.LIST(db.INTEGER)),
("testListProp2", ["a", "b", "a"], db.LIST(db.TEXT)),
("testScalarProp1", "bla", db.TEXT),
("testScalarProp2", False, db.BOOLEAN),
("testEmptyProp", None, db.REFERENCE),
("testNoneListProp", [None, None], db.LIST(db.REFERENCE)),
]
for name, value, dtype in names_values_dtypes:
rec.add_property(name=name, value=value, datatype=dtype)
# property doesn't exist, so do nothing
returned = rec.remove_value_from_property("nonexisting", "some_value")
assert returned is rec
for name, value, dtype in names_values_dtypes:
assert rec.get_property(name).value == value
assert rec.get_property(name).datatype == dtype
# value doesn't exist so nothing changes either
rec.remove_value_from_property("testListProp1", 0)
assert rec.get_property("testListProp1").value == [1, 2, 3]
assert rec.get_property("testListProp1").datatype == db.LIST(db.INTEGER)
returned = rec.remove_value_from_property("testScalarProp2", True)
assert returned is rec
assert rec.get_property("testScalarProp2").value is False
assert rec.get_property("testScalarProp2").datatype == db.BOOLEAN
# Simple removals from lists without emptying them
rec.remove_value_from_property("testListProp1", 1)
assert rec.get_property("testListProp1").value == [2, 3]
rec.remove_value_from_property("testListProp1", 2)
assert rec.get_property("testListProp1").value == [3]
# similarly to Python's `list.remove()`, only remove first occurrance
rec.remove_value_from_property("testListProp2", "a")
assert rec.get_property("testListProp2").value == ["b", "a"]
# default is to remove an empty property:
rec.remove_value_from_property("testListProp1", 3)
assert rec.get_property("testListProp1") is None
rec.remove_value_from_property("testScalarProp1", "bla")
assert rec.get_property("testScalarProp1") is None
# don't remove if `remove_if_empty_afterwards=False`
rec.remove_value_from_property("testListProp2", "b")
rec.remove_value_from_property("testListProp2", "a", remove_if_empty_afterwards=False)
assert rec.get_property("testListProp2") is not None
assert rec.get_property("testListProp2").value is None
assert rec.get_property("testListProp2").datatype == db.LIST(db.TEXT)
rec.remove_value_from_property("testScalarProp2", False, remove_if_empty_afterwards=False)
assert rec.get_property("testScalarProp2") is not None
assert rec.get_property("testScalarProp2").value is None
assert rec.get_property("testScalarProp2").datatype == db.BOOLEAN
# Special case of an already empty property: It is not empty because a value
# was removed by `remove_value_from_property` but never had a value in the
# first place. So even `remove_if_empty_afterwards=True` should not lead to
# its removal.
rec.remove_value_from_property("testEmptyProp", 1234, remove_if_empty_afterwards=True)
assert rec.get_property("testEmptyProp") is not None
assert rec.get_property("testEmptyProp").value is None
assert rec.get_property("testEmptyProp").datatype == db.REFERENCE
# Corner case of corner case: remove with `value=None` and
# `remove_if_empty_afterwards=True` keeps the empty property.
rec.remove_value_from_property("testEmptyProp", None, remove_if_empty_afterwards=True)
assert rec.get_property("testEmptyProp") is not None
assert rec.get_property("testEmptyProp").value is None
assert rec.get_property("testEmptyProp").datatype == db.REFERENCE
# Remove `None` from list `[None, None]`
rec.remove_value_from_property("testNoneListProp", None, remove_if_empty_afterwards=True)
assert rec.get_property("testNoneListProp") is not None
assert rec.get_property("testNoneListProp").value == [None]
assert rec.get_property("testNoneListProp").datatype == db.LIST(db.REFERENCE)
Loading