Exemplo n.º 1
0
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
Exemplo n.º 2
0
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()
Exemplo n.º 4
0
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)