def run_and_compare(dl_collection, test): mm = MongoModel('DocLayer') mm_collection = mm['test']['test'] (selector, update) = test update = util.deep_convert_to_ordered(update) dl_collection.delete_many({}) def up(c, s, u): c.update_one(s, u, upsert=True) mm_err = dl_err = False try: up(mm_collection, selector, update) except MongoModelException: mm_err = True try: up(dl_collection, selector, update) except OperationFailure: dl_err = True assert mm_err == dl_err, "Expected both to fail or succeed but, mm: {}, dl: {}".format( mm_err, dl_err) mm_ret = [ util.deep_convert_to_unordered(i) for i in mm_collection.find({}) ] mm_ret.sort() dl_ret = [ util.deep_convert_to_unordered(i) for i in dl_collection.find({}) ] dl_ret.sort() for doc in mm_ret: del doc['_id'] for doc in dl_ret: del doc['_id'] assert mm_ret == dl_ret
def run_and_match(dl_collection, test): mm = MongoModel('DocLayer') mm_collection = mm['test']['test'] dl_collection.delete_many({}) (doc, queries) = test doc = util.deep_convert_to_ordered(doc) mm_collection.insert_one(doc) dl_collection.insert_one(doc) for query in queries: ret1 = [util.deep_convert_to_unordered(i) for i in mm_collection.find(query)] ret1.sort() ret2 = [util.deep_convert_to_unordered(i) for i in dl_collection.find(query)] ret2.sort() assert len(ret1) == len(ret2), "Number returned docs don't match, mm: {}, dl: {}".format(len(ret1), len(ret2)) for i in range(0, len(ret1)): assert ret1[i] == ret2[i], "Mismatch at {}, mm: {}, dl: {}".format(i, ret1[i], ret2[i])
def get_result(query, collection, projection, sort, limit, skip, exception_msg): try: if gen.global_prng.random() < 0.10: cur = collection.find(query, projection, batch_size=gen.global_prng.randint(2, 10)) else: cur = collection.find(query, projection) if sort is None: ret = [util.deep_convert_to_unordered(i) for i in cur] ret.sort(cmp=util.mongo_compare_unordered_dict_items) elif isinstance(collection, MongoCollection): ret = copy.deepcopy([i for i in cur]) for i, val in enumerate(ret): if '_id' in val: val['_id'] = 0 ret = util.MongoModelNondeterministicList(ret, sort, limit, skip, query, projection, collection.options) # print ret else: ret = [i for i in cur.sort(sort).skip(skip).limit(limit)] for i, val in enumerate(ret): if '_id' in val: val['_id'] = 0 # print '1====', i, ret[i] return ret except pymongo.errors.OperationFailure as e: exception_msg.append('Caught PyMongo error:\n\n' ' Collection: %s\n' % str(collection) + ' Exception: %s\n' % str(e) + ' Query: %s\n' % str(query) + ' Projection: %s\n' % str(projection) + ' Sort: %s\n' % str(sort) + ' Limit: %r\n' % limit + ' Skip: %r\n' % skip) except MongoModelException as e: exception_msg.append('Caught Mongo Model error:\n\n' ' Collection: %s\n' % str(collection) + ' Exception: %s\n' % str(e) + ' Query: %s\n' % str(query) + ' Projection: %s\n' % str(projection) + ' Sort: %s\n' % str(sort) + ' Limit: %r\n' % limit + ' Skip: %r\n' % skip) return list()
def test(collection1, collection2, test): (label, selector, update, operator_type) = test sys.stdout.write('\tTesting \"%s\"... ' % label) update = util.deep_convert_to_ordered(update) collection1.remove() collection2.remove() def up(c, s, u): c.update(s, u, upsert=True, multi=False) errors = [] ret1 = ret2 = [] for c in (collection1, collection2): try: up(c, selector, update) except OperationFailure as e: errors.append("PyMongo upsert failed! Error was: " + str(e)) except MongoModelException as e: errors.append("MongoModel upsert failed! Error was: " + str(e)) if (len(errors)) == 1: print util.alert('FAIL', 'fail') print errors[0] return (False, [], [], operator_type) elif (len(errors)) == 2: print util.alert('PASS', 'okblue') return (True, [], [], operator_type) ret1 = [util.deep_convert_to_unordered(i) for i in collection1.find({})] ret1.sort() ret2 = [util.deep_convert_to_unordered(i) for i in collection2.find({})] ret2.sort() def error_report(msg): print util.indent(msg) print util.indent("Selector was: %s" % pprint(dict(selector))) print util.indent("Update was %s" % pprint(dict(update))) print util.indent("Upsert from collection1: %s" % ret1) print util.indent("Upsert from collection2: %s" % ret2) passed = True try: if len(ret1) + len(ret2) == 0: raise ValueError("NIL") for i in range(0, max(len(ret1), len(ret2))): try: del ret1[i]['_id'] except: pass try: del ret2[i]['_id'] except: pass assert ret1[i] == ret2[i] print util.alert('PASS', 'okgreen') except AssertionError: print util.alert('FAIL', 'fail') error_report("Upserts didn't match!") passed = False except IndexError: print util.alert('FAIL', 'fail') error_report("One or both upserts failed!") passed = False except ValueError as e: print util.alert("PASS (%s)" % str(e), 'okblue') return (passed, ret1, ret2, operator_type)