Skip to content

Instantly share code, notes, and snippets.

@ajdavis
Last active February 16, 2018 14:20
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ajdavis/96e4c64be32fce042f10 to your computer and use it in GitHub Desktop.
Save ajdavis/96e4c64be32fce042f10 to your computer and use it in GitHub Desktop.
Demonstrate "black pipe" testing a MongoDB application using MockupDB: http://mockupdb.readthedocs.org/
import logging
import unittest
from flask import Flask, make_response
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
from mockupdb import go, MockupDB, Command
logging.basicConfig()
def make_app(mongodb_uri):
app = Flask("my app")
db = MongoClient(mongodb_uri)
@app.route("/pages/<page_name>")
def page(page_name):
try:
doc = db.content.pages.find_one({'name': page_name})
except ConnectionFailure:
return make_response('Closed for renovations')
return make_response(doc['contents'])
return app
class MockupDBFlaskTest(unittest.TestCase):
def setUp(self):
self.server = MockupDB(auto_ismaster=True, verbose=True)
self.server.run()
self.app = make_app(self.server.uri).test_client()
def tearDown(self):
self.server.stop()
def test(self):
future = go(self.app.get, "/pages/my_page_name")
request = self.server.receives(
Command('find', 'pages', filter={'name': 'my_page_name'}))
request.ok(cursor={'id': 0, 'firstBatch': [{'contents': 'foo'}]})
http_response = future()
self.assertEqual("foo",
http_response.get_data(as_text=True))
def test_hangup(self):
future = go(self.app.get, "/pages/my_page_name")
request = self.server.receives(
Command('find', 'pages', filter={'name': 'my_page_name'}))
request.hangup()
http_response = future()
self.assertIn("renovations",
http_response.get_data(as_text=True))
if __name__ == '__main__':
unittest.main()
@bmwant
Copy link

bmwant commented Nov 12, 2015

Change gist filename extension so Github will highlight the Python code

@ajdavis
Copy link
Author

ajdavis commented Feb 16, 2018

Done, and updated for MongoDB 3.2's new "find" command protocol.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment