diff options
author | Will Holley <willholley@gmail.com> | 2017-10-18 11:25:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-18 11:25:53 +0100 |
commit | 69ebe617d17747249a7bca01a45d33e27b5ac4b9 (patch) | |
tree | 3ed578d6e54bd6cf560534c8086d35ddc6a35425 | |
parent | 464a6b100e831cded99ee14ccab43ad661ee9204 (diff) | |
download | couchdb-69ebe617d17747249a7bca01a45d33e27b5ac4b9.tar.gz |
Configurable Mango test parameters (#899)
The Mango test suite previously assumed that the target
CouchDB for testing was at http://127.0.0.1:15984 with
username "testuser" and password "testpass".
It's helpful to be able to override these defaults
so we can test against other environments, including those
that do not support basic authentication. This commit
adds support for overriding the defaults using environment
variables.
Now that we enable tests to be run against remote
clusters, default to n=1 at database creation time
to prevent assertion failures due to eventual
consistency between replicas.
-rw-r--r-- | src/mango/test/README.md | 14 | ||||
-rw-r--r-- | src/mango/test/mango.py | 34 |
2 files changed, 39 insertions, 9 deletions
diff --git a/src/mango/test/README.md b/src/mango/test/README.md index 3aace39b0..a7f6350b0 100644 --- a/src/mango/test/README.md +++ b/src/mango/test/README.md @@ -14,4 +14,16 @@ To run an individual test suite: nosetests --nocapture test/12-use-correct-index.py To run the tests with text index support: - MANGO_TEXT_INDEXES=1 nosetests --nocapture test
\ No newline at end of file + MANGO_TEXT_INDEXES=1 nosetests --nocapture test + + +Test configuration +================== + +The following environment variables can be used to configure the test fixtures: + +COUCH_HOST - root url (including port) of the CouchDB instance to run the tests against. Default is "http://127.0.0.1:15984". +COUCH_USER - CouchDB username (with admin premissions). Default is "testuser" +COUCH_PASSWORD - CouchDB password. Default is "testpass" +COUCH_AUTH_HEADER - Optional Authorization header value. If specified, this is used instead of basic authentication with the username/password variables above. +MANGO_TEXT_INDEXES - Set to "1" to run the tests only applicable to text indexes diff --git a/src/mango/test/mango.py b/src/mango/test/mango.py index 576cec6eb..ed4cafbe5 100644 --- a/src/mango/test/mango.py +++ b/src/mango/test/mango.py @@ -29,26 +29,44 @@ def random_db_name(): def has_text_service(): return os.environ.get('MANGO_TEXT_INDEXES') == '1' +def get_from_environment(key, default): + value = os.environ.get(key) + return value if value is not None else default + class Database(object): - def __init__(self, host, port, dbname, auth=None): - self.host = host - self.port = port + def __init__(self, dbname, + host="127.0.0.1", port="15984", + user='testuser', password='testpass'): + root_url = get_from_environment('COUCH_HOST', "http://{}:{}".format(host, port)) + auth_header = get_from_environment('COUCH_AUTH_HEADER', None) + user = get_from_environment('COUCH_USER', user) + password = get_from_environment('COUCH_PASSWORD', password) + + self.root_url = root_url self.dbname = dbname self.sess = requests.session() - self.sess.auth = ('testuser', 'testpass') + + # allow explicit auth header to be set to enable testing + # against deployments where basic auth isn't available + if auth_header is not None: + self.sess.headers["Authorization"] = auth_header + else: + self.sess.auth = (user, password) + self.sess.headers["Content-Type"] = "application/json" + @property def url(self): - return "http://{}:{}/{}".format(self.host, self.port, self.dbname) + return "{}/{}".format(self.root_url, self.dbname) def path(self, parts): if isinstance(parts, ("".__class__, u"".__class__)): parts = [parts] return "/".join([self.url] + parts) - def create(self, q=1, n=3): + def create(self, q=1, n=1): r = self.sess.get(self.url) if r.status_code == 404: r = self.sess.put(self.url, params={"q":q, "n": n}) @@ -206,7 +224,7 @@ class UsersDbTests(unittest.TestCase): @classmethod def setUpClass(klass): - klass.db = Database("127.0.0.1", "15984", "_users") + klass.db = Database("_users") user_docs.setup_users(klass.db) def setUp(self): @@ -217,7 +235,7 @@ class DbPerClass(unittest.TestCase): @classmethod def setUpClass(klass): - klass.db = Database("127.0.0.1", "15984", random_db_name()) + klass.db = Database(random_db_name()) klass.db.create(q=1, n=3) def setUp(self): |