def test_DataListOfListWithFieldsArrayQuery_RaiseException(self):
        # Arrange
        data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
        fields = '[].address'

        # Act & Assert
        with pytest.raises(AssertionError):
            result = collection_filter(data, fields)
    def test_DataPrimitiveTypeWithFieldsDontCare_RaiseException(self):
        # Arrange
        data = 1
        fields = 'foo'

        # Act & Assert
        with pytest.raises(AssertionError):
            result = collection_filter(data, fields)
    def test_DataListOfPrimitiveTypeWithFieldsArrayQuery_RaiseException(self):
        # Arrange
        data = [1, 2, 3]
        fields = '[].address'

        # Act & Assert
        with pytest.raises(AssertionError):
            result = collection_filter(data, fields)
    def test_DataListWithFieldOneKey_RaiseException(self):
        # Arrange
        data = [{'foo': 1}, {'bar': 2}]
        fields = 'foo'

        # Act & Assert
        with pytest.raises(AssertionError):
            result = collection_filter(data, fields)
    def test_DataDictWithFieldsArrayQuery_RaiseException(self):
        # Arrange
        data = {'foo': 1, 'bar': 2}
        fields = '[].foo'

        # Act & Assert
        with pytest.raises(AssertionError):
            result = collection_filter(data, fields)
    def test_DataDictTwoLevelWithFieldsTwoElement_ReturnSubsetData(self):
        # Arrange
        data = {'foo': {'Alice': 'someone', 'Bob': 'Say Hi!', 'orange': 'banana'}}
        fields = 'foo.Alice,foo.orange'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == {'foo': {'Alice': 'someone', 'orange': 'banana'}}
    def test_DataDictWithFieldsTwoElement_ReturnSubsetData(self):
        # Arrange
        data = {'foo': 1, 'bar': 2, 'Alice': 'someone', 'Bob': 'Say Hi!'}
        fields = 'foo,Alice'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == {'foo': 1, 'Alice': 'someone'}
    def test_DataDictWithFieldsOneElement_ReturnSubsetData(self):
        # Arrange
        data = {'foo': 1, 'bar': 2}
        fields = 'foo'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == {'foo': 1}
    def test_DataListWithFieldsTwoArrayQuery_ReturnSubsetOfListData(self):
        # Arrange
        data = [{'foo': {'apple': 1, 'orange': 2}}, {'foo': {'apple': 3, 'orange': 4, 'banana': 5}}]
        fields = '[].foo.apple,[].foo.orange'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == [{'foo': {'apple': 1, 'orange': 2}}, {'foo': {'apple': 3, 'orange': 4}}]
    def test_DataListWithFieldsNonexistingArrayQuery_ReturnEmptyListData(self):
        # Arrange
        data = [{'foo': 1, 'bar': 2}, {'foo': 3, 'bar': 4, 'orange': 'banana'}]
        fields = '[].nonexisted'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == [{}, {}]
    def test_DataListWithFieldsArrayQuery_ReturnSubsetOfListData(self):
        # Arrange
        data = [{'foo': 1, 'bar': 2}, {'foo': 3, 'bar': 4, 'orange': 'banana'}]
        fields = '[].foo'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == [{'foo': 1}, {'foo': 3}]
    def test_DataListOfObjectWithFieldsEmptyString_ReturnOriginalData(self):
        # Arrange
        data = [{'foo': 1}, {'bar': 2}]
        fields = ''

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert data == result
    def test_DataListWithFieldsArrayQuery_ReturnOriginalList(self):
        # Arrange
        data = [{'foo': 1}, {'bar': 2}]
        fields = '[]'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == data
    def test_DataDictIncludeListWithFieldsDeepKeyQuery_ReturnSubsetData(self):
        # Arrange
        data = {'foo': 1, 'aList': [{'elem1': 1}, {'elem2': 2}, {'elem3': 3}]}
        fields = 'aList[].elem1'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == {'aList': [{'elem1': 1}, {}, {}]}
    def test_DataDictWithFieldsEmptyString_ReturnOriginalData(self):
        # Arrange
        data = {'foo': 'bar'}
        fields = ''

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert data == result
    def test_DataDictIncludeListWithTwoFieldsDeepKeyQuery_ReturnUnionSubsetData(self):
        # Arrange
        data = {'foo': 1, 'aList': [{'foo': 1, 'bar': 2, 'dontcare': 99}, {'foo': 3, 'bar': 4, 'dontcare': 100}]}
        fields = 'aList[].foo,aList[].bar'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == {'aList': [{'foo': 1, 'bar': 2}, {'foo': 3, 'bar': 4}]}
    def test_DataDictWithFieldsTwoLevelQuery_ReturnDeepData(self):
        # Arrange
        data = {'aDict': {'bar': 2, 'Alice': 'someone', 'Bob': 'Say Hi!'}}
        fields = 'aDict.Alice'

        # Act
        result = collection_filter(data, fields)

        # Assert
        assert result == {'aDict': {'Alice': 'someone'}}