示例#1
0
    def test_document_2(self):
        d = u.Document2()
        self.assertIsNone(d.self_value)
        self.assertDictEqual(
            d.value, {
                '_id': None,
                'f1': [None, None],
                'f2': {
                    'a': None,
                    'b': None
                },
                'm1': {
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'm2': [],
                'd2': [],
                'd1': {
                    '_id': None,
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                }
            })

        dt1 = datetime.datetime(2016, 1, 2, 3, 4, 5)
        dt2 = datetime.datetime(2016, 2, 3, 4, 5, 6)

        d.set_value({
            'f1': [111, 'x'],
            'f2': {
                'a': 222,
                'b': None
            },
        })
        self.assertIsNone(d.self_value)
        self.assertDictEqual(
            d.value, {
                '_id': None,
                'f1': [111, 'x'],
                'f2': {
                    'a': 222,
                    'b': None
                },
                'm1': {
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'm2': [],
                'd1': {
                    '_id': None,
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'd2': []
            })

        self.assertDictEqual(d.query,
                             {'$set': {
                                 'f1': [111, 'x'],
                                 'f2.a': 222
                             }})

        d['m1'].value = {
            'x1': 1,
            'x2': [dt1],
            'x3': [2, None],
            'x4': {
                'a': 3,
                'b': None
            }
        }
        self.assertDictEqual(
            d.query, {
                '$set': {
                    'f1': [111, 'x'],
                    'f2.a': 222,
                    'm1.x1': 1.0,
                    'm1.x2': [dt1],
                    'm1.x3': [2, None],
                    'm1.x4.a': 3
                }
            })

        d['m2'].append_value({
            'x1': 1,
            'x2': [dt1],
            'x3': [2, None],
            'x4': {
                'a': 3,
                'b': None
            }
        })
        self.assertDictEqual(
            d.query, {
                '$set': {
                    'f1': [111, 'x'],
                    'f2.a':
                    222,
                    'm1.x1':
                    1.0,
                    'm1.x2': [dt1],
                    'm1.x3': [2, None],
                    'm1.x4.a':
                    3,
                    'm2': [{
                        'x2': [dt1],
                        'x3': [2, None],
                        'x1': 1.0,
                        'x4': {
                            'a': 3,
                            'b': None
                        }
                    }]
                }
            })

        d['m1.x2'].value = [dt2, dt1]
        self.assertDictEqual(
            d.query, {
                '$set': {
                    'f1': [111, 'x'],
                    'f2.a':
                    222,
                    'm1.x1':
                    1.0,
                    'm1.x2': [dt2, dt1],
                    'm1.x3': [2, None],
                    'm1.x4.a':
                    3,
                    'm2': [{
                        'x2': [dt1],
                        'x3': [2, None],
                        'x1': 1.0,
                        'x4': {
                            'a': 3,
                            'b': None
                        }
                    }]
                }
            })

        self.assertEqual(d['m1'].prop1, 3.0)
        self.assertEqual(d['m2.0'].prop1, 3.0)
        d['m1.x1'].value = 10
        d['m2.0.x1'].value = 20
        self.assertEqual(d['m1'].prop1, 12.0)
        self.assertEqual(d['m2.0'].prop1, 22.0)
示例#2
0
    def test_document_4(self):
        dt1 = datetime.datetime(2016, 1, 2, 3, 4, 5)
        dt2 = datetime.datetime(2016, 2, 3, 4, 5, 6)
        id1 = ObjectId()
        id2 = ObjectId()

        d = u.Document2()
        # scheme = {
        #     'f1': (int, str),
        #     'f2': {'a': int, 'b': int},
        #     'm1': Model1,
        #     'm2': [Model1],
        #     'd1': Document1,
        #     'd2': [Document1]
        # }

        d['d2'].append_value({
            'x1': 100,
            'x2': [dt1],
            'x3': (200, 1),
            'x4': {
                'b': 300
            }
        })
        self.assertTrue(d.dirty)
        self.assertIsNone(d.self_value)

        self.assertDictEqual(
            d.value, {
                '_id':
                None,
                'f1': [None, None],
                'f2': {
                    'a': None,
                    'b': None
                },
                'm1': {
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'm2': [],
                'd1': {
                    '_id': None,
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'd2': [{
                    '_id': None,
                    'x1': 100.0,
                    'x2': [dt1],
                    'x3': [200, 1],
                    'x4': {
                        'a': None,
                        'b': 300
                    }
                }],
            })

        with self.assertRaises(mokito.errors.MokitoDBREFError):
            _ = d.query

        d['d2.0'].id = id1
        d['d2.0'].dirty_clear()

        self.assertTrue(d.dirty)
        self.assertDictEqual(
            d.query,
            {'$set': {
                'd2': [DBRef(u.Document1.__collection__, id1)]
            }})

        d.dirty_clear()
        d['d2'][1].value = {
            'x1': 200.0,
            'x2': [dt2],
            'x3': [300, 2],
            'x4': {
                'a': None,
                'b': 400
            }
        }
        with self.assertRaises(mokito.errors.MokitoDBREFError):
            _ = d.query

        d['d2.1'].id = id2
        d['d2.1'].dirty_clear()
        self.assertTrue(d.dirty)
        self.assertDictEqual(
            d.query, {
                '$set': {
                    'd2': [
                        DBRef(u.Document1.__collection__, id1),
                        DBRef(u.Document1.__collection__, id2)
                    ]
                }
            })
        del d['d2.0']
        self.assertDictEqual(
            d.query,
            {'$set': {
                'd2': [DBRef(u.Document1.__collection__, id2)]
            }})

        d.dirty_clear()
        d['d2.0.x1'].value = 55
        self.assertFalse(d.dirty)
        self.assertDictEqual(d.query, {})

        self.assertDictEqual(
            d['d2'].value[0], {
                '_id': id2,
                'x2': [dt2],
                'x3': [300, 2],
                'x1': 55.0,
                'x4': {
                    'a': None,
                    'b': 400
                }
            })
        self.assertEqual(d['d2'].self_value[0],
                         DBRef(u.Document1.__collection__, id2))
示例#3
0
    def test_from_json_1(self):
        d = u.Document2()
        self.assertFalse(d.dirty)
        d.set_value(u.col2_data2, inner=True)
        self.assertTrue(d.dirty)
        self.assertEqual(d['d1'].dbref, u.col1_dbref2)

        yield d['d1'].reload()
        yield [i.reload() for i in d['d2']]
        self.assertDictEqual(
            d.value, {
                '_id':
                u.col2_id2,
                'f1': [45602, 'foo3'],
                'f2': {
                    'a': 11,
                    'b': 12
                },
                'm1': {
                    'x1': 0.2,
                    'x2': [u.dt11, u.dt12],
                    'x3': [7, 3],
                    'x4': {
                        'a': 8,
                        'b': 8
                    }
                },
                'm2': [{
                    'x1': 0.2,
                    'x2': [u.xt1],
                    'x3': [8, 1],
                    'x4': {
                        'a': 9,
                        'b': 9
                    }
                }, {
                    'x1': 0.3,
                    'x2': [u.xt2, u.xt3],
                    'x3': [9, 2],
                    'x4': {
                        'a': 10,
                        'b': 10
                    }
                }],
                'd1': {
                    'x1': 1.5,
                    'x2': [u.dt4, u.dt5, u.dt6],
                    'x3': [45601, 2],
                    'x4': {
                        'a': 3,
                        'b': 4
                    },
                    '_id': u.col1_id2
                },
                'd2': [{
                    'x1': 1.5,
                    'x2': [u.dt4, u.dt5, u.dt6],
                    'x3': [45601, 2],
                    'x4': {
                        'a': 3,
                        'b': 4
                    },
                    '_id': u.col1_id2
                }]
            })
示例#4
0
    def test_document_3(self):
        dt2 = datetime.datetime(2016, 2, 3, 4, 5, 6)

        d = u.Document2()
        # scheme = {
        #     'f1': (int, str),
        #     'f2': {'a': int, 'b': int},
        #     'm1': Model1,
        #     'm2': [Model1],
        #     'd1': Document1, ->Model1
        #     'd2': [Document1] ->[Model1]
        # }

        d['d1'].value = {
            'x1': 100,
            'x2': [dt2],
            'x3': (200, 3),
            'x4': {
                'b': 300
            }
        }
        self.assertFalse(d.dirty)
        self.assertIsNone(d.self_value)
        self.assertDictEqual(
            d.value, {
                '_id': None,
                'f1': [None, None],
                'f2': {
                    'a': None,
                    'b': None
                },
                'm1': {
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'm2': [],
                'd1': {
                    '_id': None,
                    'x1': 100.0,
                    'x2': [dt2],
                    'x3': [200, 3],
                    'x4': {
                        'a': None,
                        'b': 300
                    }
                },
                'd2': []
            })

        self.assertEqual(d.query, {})
        # with self.assertRaises(mokito.errors.MokitoDBREFError):
        #     _ = d.query

        id1 = ObjectId()
        d['d1'].id = id1
        self.assertDictEqual(
            d.query, {'$set': {
                'd1': DBRef(u.Document1.__collection__, id1)
            }})

        d.dirty_clear()
        self.assertFalse(d.dirty)
        self.assertDictEqual(
            d.query, {'$set': {
                'd1': DBRef(u.Document1.__collection__, id1)
            }})

        d['d1'].dirty_clear()
        d['d1.x4.a'].value = 500
        self.assertFalse(d.dirty)
        self.assertDictEqual(d.query, {})
        self.assertTrue(d['d1'].dirty)
        self.assertDictEqual(d['d1'].query, {'$set': {'x4.a': 500}})

        # # d['d1'].value = None
        # # d['d1'] = None
        del d['d1']
        self.assertTrue(d.dirty)
        self.assertDictEqual(d.query, {'$unset': {'d1': ''}})

        # d['f1'].value = None
        # d['f1'] = None
        del d['f1']
        self.assertTrue(d.dirty)
        self.assertDictEqual(d.query, {
            '$set': {
                'f1': [None, None]
            },
            '$unset': {
                'd1': ''
            }
        })

        del d['f2']
        self.assertTrue(d.dirty)
        self.assertDictEqual(
            d.query, {
                '$set': {
                    'f1': [None, None],
                    'f2.a': None,
                    'f2.b': None
                },
                '$unset': {
                    'd1': ''
                }
            })

        del d['m1']
        self.assertTrue(d.dirty)
        self.assertDictEqual(
            d.query, {
                '$set': {
                    'f1': [None, None],
                    'f2.a': None,
                    'f2.b': None,
                    'm1.x1': None,
                    'm1.x2': [],
                    'm1.x3': [None, None],
                    'm1.x4.a': None,
                    'm1.x4.b': None
                },
                '$unset': {
                    'd1': ''
                }
            })

        del d['m2']
        self.assertTrue(d.dirty)
        self.assertDictEqual(
            d.query, {
                '$set': {
                    'f1': [None, None],
                    'f2.a': None,
                    'f2.b': None,
                    'm1.x1': None,
                    'm1.x2': [],
                    'm1.x3': [None, None],
                    'm1.x4.a': None,
                    'm1.x4.b': None,
                    'm2': []
                },
                '$unset': {
                    'd1': ''
                }
            })

        d.dirty_clear()
        del d['d2']
        self.assertTrue(d.dirty)
        self.assertDictEqual(d.query, {'$set': {'d2': []}})
示例#5
0
    def test_save_4(self):
        x = u.Document2()
        x['f1.1'].value = 'foo'
        x['f2.a'].value = 123

        self.assertIsNone(x.id)
        self.assertEqual((yield self.db[u.TEST_COLLECTION2].count()), 2)

        res = yield x.save()
        self.assertTrue(res)
        self.assertDictEqual(
            x.value,
            {
                '_id': x.id,
                'f1': [None, 'foo'],
                'f2': {
                    'a': 123,
                    'b': None
                },
                'm1': {
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'm2': [],
                'd1': {
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    },
                    '_id': None
                },
                # 'd1': {'_id': None, 'x2': [], 'x3': [None, None], 'x1': None, 'x4': {'a': None, 'b': None}},
                'd2': []
            })
        self.assertIsNotNone(x.id)
        self.assertEqual((yield self.db[u.TEST_COLLECTION2].count()), 3)

        res = yield self.db[u.TEST_COLLECTION2].find_one(
            {'_id': {
                '$nin': [u.col2_id1, u.col2_id2]
            }})
        self.assertDictEqual(
            res, {
                '_id': x.id,
                'f1': [None, 'foo'],
                'f2': {
                    'a': 123,
                    'b': None
                },
                'm1': {
                    'x1': None,
                    'x2': [],
                    'x3': [None, None],
                    'x4': {
                        'a': None,
                        'b': None
                    }
                },
                'm2': [],
                'd1': None,
                'd2': []
            })