blob: 2d4184ce11202b0f2131681d727261146492e045 [file] [log] [blame]
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for the field_mask_util.py module."""
from chromite.third_party.google.protobuf import field_mask_pb2
from chromite.lib import cros_test_lib
from chromite.utils import field_mask_util
class CreateFilteredDictTest(cros_test_lib.TestCase):
"""Unit tests for CreateFilteredDict"""
def testCreateFilteredDictWithFieldAndSubField(self) -> None:
"""Tests selecting top-level fields and sub-fields."""
original_dict = {
"a": {
"b": {
"c": "val1",
"d": 2,
}
},
"e": {
"f": {
"g": "val2",
"h": 3,
}
},
"i": 3,
"j": "val3",
}
field_mask = field_mask_pb2.FieldMask(paths=["a.b.c", "e.f", "i"])
expected_dict = {
"a": {
"b": {
"c": "val1",
}
},
"e": {
"f": {
"g": "val2",
"h": 3,
}
},
"i": 3,
}
merged_dict = field_mask_util.CreateFilteredDict(
field_mask, original_dict
)
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithOverlappingSubFields(self) -> None:
"""Tests selecting overlapping sub-fields."""
original_dict = {
"a": {
"b": {
"c": "val1",
"d": 2,
"e": 3,
},
},
}
field_mask = field_mask_pb2.FieldMask(paths=["a.b.c", "a.b.e"])
expected_dict = {
"a": {
"b": {
"c": "val1",
"e": 3,
},
},
}
merged_dict = field_mask_util.CreateFilteredDict(
field_mask, original_dict
)
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithEmptyPath(self) -> None:
"""Tests a FieldMask with the empty string as a path."""
original_dict = {"a": 1}
field_mask = field_mask_pb2.FieldMask(paths=[""])
with self.assertRaisesRegex(ValueError, "Field cannot be empty string"):
field_mask_util.CreateFilteredDict(field_mask, original_dict)
def testCreateFilteredDictWithInvalidPath(self) -> None:
"""Tests a FieldMask with an invalid path."""
original_dict = {"a": 1, "c": 2}
# Note that 'b' is not a path in the dict.
field_mask = field_mask_pb2.FieldMask(paths=["a", "b"])
expected_dict = {"a": 1}
with cros_test_lib.LoggingCapturer() as logging_capturer:
merged_dict = field_mask_util.CreateFilteredDict(
field_mask, original_dict
)
# The merged dict should contain only field 'a' ('b' does not exist, 'c'
# is not in the field mask). A warning about 'b' was logged.
self.assertTrue(logging_capturer.LogsContain("Field b not found."))
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithLists(self) -> None:
"""Tests selecting fields that are lists."""
original_dict = {
"a": [1, 2],
"b": [3, 4],
"c": {
"d": [5, 6],
"e": [7, 8],
},
"f": [
{
"g": 9,
"h": 10,
},
{
"g": 11,
"h": 12,
},
],
}
field_mask = field_mask_pb2.FieldMask(paths=["a", "c.d", "f"])
expected_dict = {
"a": [1, 2],
"c": {
"d": [5, 6],
},
"f": [
{
"g": 9,
"h": 10,
},
{
"g": 11,
"h": 12,
},
],
}
merged_dict = field_mask_util.CreateFilteredDict(
field_mask, original_dict
)
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithListSubFields(self) -> None:
"""Tests selecting a list that is not the last position in a path."""
original_dict = {
"a": [1, 2],
"b": [3, 4],
"c": {
"d": [5, 6],
"e": [7, 8],
},
"f": [
{
"g": 9,
"h": 10,
},
{
"g": 11,
"h": 12,
},
],
}
field_mask = field_mask_pb2.FieldMask(paths=["f.g"])
with self.assertRaisesRegex(
ValueError, "Field f is a list and cannot have sub-fields"
):
field_mask_util.CreateFilteredDict(field_mask, original_dict)
def testCreateFilteredDictWithEmptyFieldMask(self) -> None:
"""Tests a FieldMask with no paths."""
original_dict = {"a": 1}
field_mask = field_mask_pb2.FieldMask()
merged_dict = field_mask_util.CreateFilteredDict(
field_mask, original_dict
)
self.assertDictEqual({}, merged_dict)