class TestQuerySuccess(unittest.TestCase):
    """These are very much implementation-specific, so they might have be removed,
    should the internal API change, but for the current MongoProtocol implementation
    they make sense.

    """
    def setUp(self):
        self.protocol = MongoProtocol()
        self.query = _MongoQuery(0, 'foobar', 5)
        # A query has been sent, so id is different from the one in the query
        self.protocol._MongoProtocol__id = 1
        self.protocol._MongoProtocol__queries[self.query.id] = self.query
        self.protocol.transport = StringTransport()

    def test_UnknownRequestId(self):
        self.protocol.querySuccess(1, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failIf(self.query.deferred.called,
                    "The query was not found so the Deferred should not fire")

    def test_CursorExhausted(self):
        self.protocol.querySuccess(0, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 0)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failUnless(
            self.query.deferred.called,
            "The required number of documents was retrieved, the deferred should fire"
        )

    def test_CursorNotExhausted(self):
        self.protocol.querySuccess(0, 1, [{}, {}])
        self.assertEqual(
            len(self.protocol._MongoProtocol__queries), 1,
            "There is more data, so the query should remain in the __queries")
        self.failIfEqual(
            self.protocol._MongoProtocol__id, 1,
            "OP_GETMORE has been performed so the __id should not stay the same"
        )
        self.failIf(
            0 in self.protocol._MongoProtocol__queries,
            "Id has changed, so the key the query was under should be vacated")
        self.failIf(
            self.query.deferred.called,
            "Didn't get all the desired data, so the deferred should not fire")
        self.assertEqual(len(self.query.documents), 2)

    def test_CursorNotExhaustedAndLimitWasHit(self):
        self.query.limit = 2
        self.protocol.querySuccess(0, 1, [{}, {}])
        self.failIf(
            len(self.protocol._MongoProtocol__queries),
            "We are done with the query, there should be nothing in __queries")
        self.failUnless(
            self.query.deferred.called,
            "The required number of documents was retrieved, the deferred should fire"
        )
        self.assertEqual(len(self.query.documents), 2)

    def test_CursorNotExhaustedAndLimitWasNotHit(self):
        self.query.limit = 2
        self.protocol.querySuccess(0, 1, [{}])
        self.assertEqual(
            len(self.protocol._MongoProtocol__queries), 1,
            "There is more data, so the query should remain in the __queries")
        self.failIfEqual(
            self.protocol._MongoProtocol__id, 1,
            "OP_GETMORE has been performed so the __id should not stay the same"
        )
        self.failIf(
            0 in self.protocol._MongoProtocol__queries,
            "Id has changed, so the key the query was under should be vacated")
        self.failIf(
            self.query.deferred.called,
            "Didn't get all the desired data, so the deferred should not fire")
        self.assertEqual(len(self.query.documents), 1)

    def test_UnexpectedDocumentNumber(self):
        self.query.limit = 2
        # Testing for an AssertionError feels kind of wrong, but it really is an
        # exceptional condition, that should not ever happen according to the spec
        self.assertRaises(AssertionError, self.protocol.querySuccess, 0, 1,
                          [{}, {}, {}])
class TestQuerySuccess(unittest.TestCase):
    """These are very much implementation-specific, so they might have be removed,
    should the internal API change, but for the current MongoProtocol implementation
    they make sense.
    """
    
    def setUp(self):
        self.protocol = MongoProtocol()
        self.cursor = MongoCursor(0, 'foobar', 5, self.protocol)
        # A query has been sent, so id is different from the one in the query
        self.protocol._MongoProtocol__id = 1
        self.protocol._MongoProtocol__queries[self.cursor.request_id] = self.cursor
        self.protocol.transport = StringTransport()
    
    def test_UnknownRequestId(self):
        self.protocol.querySuccess(1, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failUnless(self.cursor.deferred, "The query was not found so the Deferred should still exist")
        self.failIf(self.cursor.deferred.called, "The query was not found so the Deferred should not fire")
    
    def test_CursorExhausted(self):
        self.protocol.querySuccess(0, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 0)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failIf(self.cursor.deferred, "The required number of documents was retrieved, the defered should be fired and gone")
    
    def test_CursorNotExhausted(self):
        self.protocol.querySuccess(0, 1, [{}, {}])
        for d in self.cursor:  # consume documents until __load_more is triggered
            if isinstance(d, defer.Deferred):
                break
        
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1,
                         "There is more data, so the query should remain in the __queries")
        self.failIfEqual(self.protocol._MongoProtocol__id, 1,
                         "OP_GETMORE has been performed so the __id should not stay the same")
        self.failIf(0 in self.protocol._MongoProtocol__queries,
                    "Id has changed, so the key the query was under should be vacated")
        self.failUnless(self.cursor.deferred,
                    "Didn't get all the desired data, so the deferred should not fire")
        self.assertEqual(len(self.cursor._buffer), 2)
    
    def test_CursorNotExhaustedAndLimitWasHit(self):
        self.cursor.limit = 2
        self.protocol.querySuccess(0, 1, [{}, {}])
        for d in self.cursor:
            self.failIf(isinstance(d, defer.Deferred), "Should not get a deferred while iterating as all documents are loaded")
        self.failIf(len(self.protocol._MongoProtocol__queries), "We are done with the query, there should be nothing in __queries")
    
    def test_CursorNotExhaustedAndLimitWasNotHit(self):
        self.cursor.limit = 2
        self.protocol.querySuccess(0, 1, [{}])
        self.failUnless(self.cursor.cursor_id, "Cursor should have a live cursor id")
        got_deferred = False
        for d in self.cursor:
            if isinstance(d, defer.Deferred):
                got_deferred = True
                break
        self.failUnless(got_deferred, "Should have got a deferred to load more while iterating through cursor")
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1, 
                            "There is more data, so the query should remain in the __queries")
        self.failIfEqual(self.protocol._MongoProtocol__id, 1,
                            "OP_GETMORE has been performed so the __id should not stay the same")
        self.failIf(0 in self.protocol._MongoProtocol__queries,
                    "Id has changed, so the key the query was under should be vacated")
        self.failUnless(self.cursor.deferred, "Cursor should have a deferred as it is loading more results")
        self.failIf(self.cursor.deferred.called, "Didn't get all the desired data, so the deferred should not fire")
    
    def test_UnexpectedDocumentNumber(self):
        self.cursor.limit = 2
        # Testing for an AssertionError feels kind of wrong, but it really is an
        # exceptional condition, that should not ever happen according to the spec
        self.assertRaises(AssertionError, self.protocol.querySuccess, 0, 1, [{}, {}, {}])
예제 #3
0
class TestQuerySuccess(unittest.TestCase):
    """These are very much implementation-specific, so they might have be removed,
    should the internal API change, but for the current MongoProtocol implementation
    they make sense.
    """
    def setUp(self):
        self.protocol = MongoProtocol()
        self.cursor = MongoCursor(0, 'foobar', 5, self.protocol)
        # A query has been sent, so id is different from the one in the query
        self.protocol._MongoProtocol__id = 1
        self.protocol._MongoProtocol__queries[
            self.cursor.request_id] = self.cursor
        self.protocol.transport = StringTransport()

    def test_UnknownRequestId(self):
        self.protocol.querySuccess(1, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failUnless(
            self.cursor.deferred,
            "The query was not found so the Deferred should still exist")
        self.failIf(self.cursor.deferred.called,
                    "The query was not found so the Deferred should not fire")

    def test_CursorExhausted(self):
        self.protocol.querySuccess(0, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 0)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failIf(
            self.cursor.deferred,
            "The required number of documents was retrieved, the defered should be fired and gone"
        )

    def test_CursorNotExhausted(self):
        self.protocol.querySuccess(0, 1, [{}, {}])
        for d in self.cursor:  # consume documents until __load_more is triggered
            if isinstance(d, defer.Deferred):
                break

        self.assertEqual(
            len(self.protocol._MongoProtocol__queries), 1,
            "There is more data, so the query should remain in the __queries")
        self.failIfEqual(
            self.protocol._MongoProtocol__id, 1,
            "OP_GETMORE has been performed so the __id should not stay the same"
        )
        self.failIf(
            0 in self.protocol._MongoProtocol__queries,
            "Id has changed, so the key the query was under should be vacated")
        self.failUnless(
            self.cursor.deferred,
            "Didn't get all the desired data, so the deferred should not fire")
        self.assertEqual(len(self.cursor._buffer), 2)

    def test_CursorNotExhaustedAndLimitWasHit(self):
        self.cursor.limit = 2
        self.protocol.querySuccess(0, 1, [{}, {}])
        for d in self.cursor:
            self.failIf(
                isinstance(d, defer.Deferred),
                "Should not get a deferred while iterating as all documents are loaded"
            )
        self.failIf(
            len(self.protocol._MongoProtocol__queries),
            "We are done with the query, there should be nothing in __queries")

    def test_CursorNotExhaustedAndLimitWasNotHit(self):
        self.cursor.limit = 2
        self.protocol.querySuccess(0, 1, [{}])
        self.failUnless(self.cursor.cursor_id,
                        "Cursor should have a live cursor id")
        got_deferred = False
        for d in self.cursor:
            if isinstance(d, defer.Deferred):
                got_deferred = True
                break
        self.failUnless(
            got_deferred,
            "Should have got a deferred to load more while iterating through cursor"
        )
        self.assertEqual(
            len(self.protocol._MongoProtocol__queries), 1,
            "There is more data, so the query should remain in the __queries")
        self.failIfEqual(
            self.protocol._MongoProtocol__id, 1,
            "OP_GETMORE has been performed so the __id should not stay the same"
        )
        self.failIf(
            0 in self.protocol._MongoProtocol__queries,
            "Id has changed, so the key the query was under should be vacated")
        self.failUnless(
            self.cursor.deferred,
            "Cursor should have a deferred as it is loading more results")
        self.failIf(
            self.cursor.deferred.called,
            "Didn't get all the desired data, so the deferred should not fire")

    def test_UnexpectedDocumentNumber(self):
        self.cursor.limit = 2
        # Testing for an AssertionError feels kind of wrong, but it really is an
        # exceptional condition, that should not ever happen according to the spec
        self.assertRaises(AssertionError, self.protocol.querySuccess, 0, 1,
                          [{}, {}, {}])
class TestQuerySuccess(unittest.TestCase):
    """These are very much implementation-specific, so they might have be removed,
    should the internal API change, but for the current MongoProtocol implementation
    they make sense.

    """

    def setUp(self):
        self.protocol = MongoProtocol()
        self.query = _MongoQuery(0, 'foobar', 5)
        # A query has been sent, so id is different from the one in the query
        self.protocol._MongoProtocol__id = 1
        self.protocol._MongoProtocol__queries[self.query.id] = self.query
        self.protocol.transport = StringTransport()

    def test_UnknownRequestId(self):
        self.protocol.querySuccess(1, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failIf(self.query.deferred.called,
                    "The query was not found so the Deferred should not fire")

    def test_CursorExhausted(self):
        self.protocol.querySuccess(0, 0, [])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 0)
        self.assertEqual(self.protocol._MongoProtocol__id, 1)
        self.failUnless(self.query.deferred.called,
                        "The required number of documents was retrieved, the deferred should fire")

    def test_CursorNotExhausted(self):
        self.protocol.querySuccess(0, 1, [{}, {}])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1,
                         "There is more data, so the query should remain in the __queries")
        self.failIfEqual(self.protocol._MongoProtocol__id, 1,
                         "OP_GETMORE has been performed so the __id should not stay the same")
        self.failIf(0 in self.protocol._MongoProtocol__queries,
                    "Id has changed, so the key the query was under should be vacated")
        self.failIf(self.query.deferred.called,
                    "Didn't get all the desired data, so the deferred should not fire")
        self.assertEqual(len(self.query.documents), 2)

    def test_CursorNotExhaustedAndLimitWasHit(self):
        self.query.limit = 2
        self.protocol.querySuccess(0, 1, [{}, {}])
        self.failIf(len(self.protocol._MongoProtocol__queries),
                    "We are done with the query, there should be nothing in __queries")
        self.failUnless(self.query.deferred.called,
                    "The required number of documents was retrieved, the deferred should fire")
        self.assertEqual(len(self.query.documents), 2)

    def test_CursorNotExhaustedAndLimitWasNotHit(self):
        self.query.limit = 2
        self.protocol.querySuccess(0, 1, [{}])
        self.assertEqual(len(self.protocol._MongoProtocol__queries), 1,
                         "There is more data, so the query should remain in the __queries")
        self.failIfEqual(self.protocol._MongoProtocol__id, 1,
                         "OP_GETMORE has been performed so the __id should not stay the same")
        self.failIf(0 in self.protocol._MongoProtocol__queries,
                    "Id has changed, so the key the query was under should be vacated")
        self.failIf(self.query.deferred.called,
                    "Didn't get all the desired data, so the deferred should not fire")
        self.assertEqual(len(self.query.documents), 1)

    def test_UnexpectedDocumentNumber(self):
        self.query.limit = 2
        # Testing for an AssertionError feels kind of wrong, but it really is an
        # exceptional condition, that should not ever happen according to the spec
        self.assertRaises(AssertionError, self.protocol.querySuccess, 0, 1, [{}, {}, {}])