Skip to content

Commit

Permalink
Merge pull request #41 from fiaas/fix-dict-behaviour
Browse files Browse the repository at this point in the history
Handle Field(dict) similar to other types
  • Loading branch information
mortenlj authored May 8, 2018
2 parents 5f72f95 + 3bae5d5 commit 76dbdf4
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 15 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ htmlcov/
.coverage
.coverage.*
.cache
.pytest_cache
nosetests.xml
coverage.xml
*,cover
Expand Down
3 changes: 2 additions & 1 deletion k8s/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,10 @@ def as_dict(self):
d[_api_name(field.name)] = value
return d

def update(self, other):
def merge(self, other):
for field in self._meta.fields:
setattr(self, field.name, getattr(other, field.name))
update = merge # For backwards compatibility

def update_from_dict(self, d):
for field in self._meta.fields:
Expand Down
2 changes: 1 addition & 1 deletion k8s/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def __set__(self, instance, new_value):
return
if new_value is not None:
try:
current_value.update(new_value)
current_value.merge(new_value)
return
except AttributeError:
pass
Expand Down
64 changes: 51 additions & 13 deletions tests/k8s/test_model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8
from __future__ import unicode_literals

import pytest
import six
from mock import create_autospec
Expand Down Expand Up @@ -48,24 +50,60 @@ def test_change(self, mock_response):
assert instance.once_field == 1
assert instance.read_only_field == 1

def test_set_dict_field_to_none(self, mock_response):
@pytest.mark.parametrize("value", (None, {}, {"key": "value"}), ids=("None", "Empty dict", "Key-Value"))
def test_set_dict_field(self, mock_response, value):
metadata = ObjectMeta(name="my-name", namespace="my-namespace")
mock_response.json.return_value = {'dict_field': {'thing': 'otherthing'}}
instance = ModelTest.get_or_create(metadata=metadata, dict_field=None)
assert instance.dict_field is None
instance = ModelTest.get_or_create(metadata=metadata, dict_field=value)
assert instance.dict_field == value

@pytest.mark.parametrize("value", (None, [], [5, 6]), ids=("None", "Empty list", "2-item list"))
def test_set_list_field_to_empty(self, mock_response, value):
metadata = ObjectMeta(name="my-name", namespace="my-namespace")
mock_response.json.return_value = {'list_field': [1, 2]}
instance = ModelTest.get_or_create(metadata=metadata, list_field=value)
assert instance.list_field == value

def test_serialization_of_empty_dict(self):
metadata = ObjectMeta(name="my-name", namespace="my-namespace")
kwargs = {"dict_field": {}, "metadata": metadata}
instance = ModelTest(**kwargs)
d = instance.as_dict()
assert "dict_field" not in d

def test_serialization_of_empty_list(self):
metadata = ObjectMeta(name="my-name", namespace="my-namespace")
kwargs = {"list_field": [], "metadata": metadata}
instance = ModelTest(**kwargs)
d = instance.as_dict()
assert d["list_field"] == []

def test_annotations_merge(self, mock_response):
def test_annotations_replace(self, mock_response):
mock_response.json.return_value = {
u"metadata": {
u"name": u"my-name",
u"namespace": u"my-namespace",
u"annotations": {
u"must_keep": u"this",
u"will_overwrite": u"this"
"metadata": {
"name": "my-name",
"namespace": "my-namespace",
"annotations": {
"must_discard": "this",
"will_overwrite": "this"
}
}
}
metadata = ObjectMeta(name="my-name", namespace="my-namespace", annotations={u"will_overwrite": u"that"})
metadata = ObjectMeta(name="my-name", namespace="my-namespace", annotations={"will_overwrite": "that"})
instance = ModelTest.get_or_create(metadata=metadata)
assert instance.metadata.annotations["will_overwrite"] == "that"
assert "must_discard" not in instance.metadata.annotations

def test_spec_merge(self, mock_response):
mock_response.json.return_value = {
"metadata": {
"name": "my-name",
"namespace": "my-namespace",
"generateName": "my-generated-name",
"selfLink": "http://this.link.stays.example.com"
}
}
metadata = ObjectMeta(name="my-name", namespace="my-namespace", generateName="my-new-generated-name")
instance = ModelTest.get_or_create(metadata=metadata)
assert instance.metadata.annotations[u"will_overwrite"] == u"that"
assert instance.metadata.annotations[u"must_keep"] == u"this"
assert instance.metadata.generateName == "my-new-generated-name"
assert instance.metadata.selfLink == "http://this.link.stays.example.com"

0 comments on commit 76dbdf4

Please sign in to comment.