This commit: 1. Formats all of our existing code using `black`. 2. Adds a note about using `black` to `CONTRIBUTING.rst`. 3. Runs `black --check` as part of CI (failing builds that aren't properly formatted).
146 lines
4.1 KiB
Python
146 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
import datetime
|
|
|
|
from mongoengine import *
|
|
|
|
from tests.utils import MongoDBTestCase
|
|
|
|
|
|
class TestMapField(MongoDBTestCase):
|
|
def test_mapfield(self):
|
|
"""Ensure that the MapField handles the declared type."""
|
|
|
|
class Simple(Document):
|
|
mapping = MapField(IntField())
|
|
|
|
Simple.drop_collection()
|
|
|
|
e = Simple()
|
|
e.mapping["someint"] = 1
|
|
e.save()
|
|
|
|
with self.assertRaises(ValidationError):
|
|
e.mapping["somestring"] = "abc"
|
|
e.save()
|
|
|
|
with self.assertRaises(ValidationError):
|
|
|
|
class NoDeclaredType(Document):
|
|
mapping = MapField()
|
|
|
|
def test_complex_mapfield(self):
|
|
"""Ensure that the MapField can handle complex declared types."""
|
|
|
|
class SettingBase(EmbeddedDocument):
|
|
meta = {"allow_inheritance": True}
|
|
|
|
class StringSetting(SettingBase):
|
|
value = StringField()
|
|
|
|
class IntegerSetting(SettingBase):
|
|
value = IntField()
|
|
|
|
class Extensible(Document):
|
|
mapping = MapField(EmbeddedDocumentField(SettingBase))
|
|
|
|
Extensible.drop_collection()
|
|
|
|
e = Extensible()
|
|
e.mapping["somestring"] = StringSetting(value="foo")
|
|
e.mapping["someint"] = IntegerSetting(value=42)
|
|
e.save()
|
|
|
|
e2 = Extensible.objects.get(id=e.id)
|
|
self.assertIsInstance(e2.mapping["somestring"], StringSetting)
|
|
self.assertIsInstance(e2.mapping["someint"], IntegerSetting)
|
|
|
|
with self.assertRaises(ValidationError):
|
|
e.mapping["someint"] = 123
|
|
e.save()
|
|
|
|
def test_embedded_mapfield_db_field(self):
|
|
class Embedded(EmbeddedDocument):
|
|
number = IntField(default=0, db_field="i")
|
|
|
|
class Test(Document):
|
|
my_map = MapField(field=EmbeddedDocumentField(Embedded), db_field="x")
|
|
|
|
Test.drop_collection()
|
|
|
|
test = Test()
|
|
test.my_map["DICTIONARY_KEY"] = Embedded(number=1)
|
|
test.save()
|
|
|
|
Test.objects.update_one(inc__my_map__DICTIONARY_KEY__number=1)
|
|
|
|
test = Test.objects.get()
|
|
self.assertEqual(test.my_map["DICTIONARY_KEY"].number, 2)
|
|
doc = self.db.test.find_one()
|
|
self.assertEqual(doc["x"]["DICTIONARY_KEY"]["i"], 2)
|
|
|
|
def test_mapfield_numerical_index(self):
|
|
"""Ensure that MapField accept numeric strings as indexes."""
|
|
|
|
class Embedded(EmbeddedDocument):
|
|
name = StringField()
|
|
|
|
class Test(Document):
|
|
my_map = MapField(EmbeddedDocumentField(Embedded))
|
|
|
|
Test.drop_collection()
|
|
|
|
test = Test()
|
|
test.my_map["1"] = Embedded(name="test")
|
|
test.save()
|
|
test.my_map["1"].name = "test updated"
|
|
test.save()
|
|
|
|
def test_map_field_lookup(self):
|
|
"""Ensure MapField lookups succeed on Fields without a lookup
|
|
method.
|
|
"""
|
|
|
|
class Action(EmbeddedDocument):
|
|
operation = StringField()
|
|
object = StringField()
|
|
|
|
class Log(Document):
|
|
name = StringField()
|
|
visited = MapField(DateTimeField())
|
|
actions = MapField(EmbeddedDocumentField(Action))
|
|
|
|
Log.drop_collection()
|
|
Log(
|
|
name="wilson",
|
|
visited={"friends": datetime.datetime.now()},
|
|
actions={"friends": Action(operation="drink", object="beer")},
|
|
).save()
|
|
|
|
self.assertEqual(1, Log.objects(visited__friends__exists=True).count())
|
|
|
|
self.assertEqual(
|
|
1,
|
|
Log.objects(
|
|
actions__friends__operation="drink", actions__friends__object="beer"
|
|
).count(),
|
|
)
|
|
|
|
def test_map_field_unicode(self):
|
|
class Info(EmbeddedDocument):
|
|
description = StringField()
|
|
value_list = ListField(field=StringField())
|
|
|
|
class BlogPost(Document):
|
|
info_dict = MapField(field=EmbeddedDocumentField(Info))
|
|
|
|
BlogPost.drop_collection()
|
|
|
|
tree = BlogPost(info_dict={u"éééé": {"description": u"VALUE: éééé"}})
|
|
|
|
tree.save()
|
|
|
|
self.assertEqual(
|
|
BlogPost.objects.get(id=tree.id).info_dict[u"éééé"].description,
|
|
u"VALUE: éééé",
|
|
)
|