-
Notifications
You must be signed in to change notification settings - Fork 3.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Jonahstanley/acceptance tests unique database #298
Changes from all commits
789b711
b0d7000
28142d5
1eaa031
a2020aa
a21303b
0bd1e78
4685cac
a896ccf
a0900f0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
""" | ||
This config file extends the test environment configuration | ||
so that we can run the lettuce acceptance tests. | ||
This is used in the django-admin call as acceptance.py | ||
contains random seeding, causing django-admin to create a random collection | ||
""" | ||
|
||
# We intentionally define lots of variables that aren't used, and | ||
# want to import all variables from base settings files | ||
# pylint: disable=W0401, W0614 | ||
|
||
from .test import * | ||
|
||
# You need to start the server in debug mode, | ||
# otherwise the browser will not render the pages correctly | ||
DEBUG = True | ||
|
||
# Disable warnings for acceptance tests, to make the logs readable | ||
import logging | ||
logging.disable(logging.ERROR) | ||
import os | ||
import random | ||
|
||
MODULESTORE_OPTIONS = { | ||
'default_class': 'xmodule.raw_module.RawDescriptor', | ||
'host': 'localhost', | ||
'db': 'acceptance_xmodule', | ||
'collection': 'acceptance_modulestore', | ||
'fs_root': TEST_ROOT / "data", | ||
'render_template': 'mitxmako.shortcuts.render_to_string', | ||
} | ||
|
||
MODULESTORE = { | ||
'default': { | ||
'ENGINE': 'xmodule.modulestore.draft.DraftModuleStore', | ||
'OPTIONS': MODULESTORE_OPTIONS | ||
}, | ||
'direct': { | ||
'ENGINE': 'xmodule.modulestore.mongo.MongoModuleStore', | ||
'OPTIONS': MODULESTORE_OPTIONS | ||
}, | ||
'draft': { | ||
'ENGINE': 'xmodule.modulestore.draft.DraftModuleStore', | ||
'OPTIONS': MODULESTORE_OPTIONS | ||
} | ||
} | ||
|
||
CONTENTSTORE = { | ||
'ENGINE': 'xmodule.contentstore.mongo.MongoContentStore', | ||
'OPTIONS': { | ||
'host': 'localhost', | ||
'db': 'acceptance_xcontent', | ||
}, | ||
# allow for additional options that can be keyed on a name, e.g. 'trashcan' | ||
'ADDITIONAL_OPTIONS': { | ||
'trashcan': { | ||
'bucket': 'trash_fs' | ||
} | ||
} | ||
} | ||
|
||
# Set this up so that rake lms[acceptance] and running the | ||
# harvest command both use the same (test) database | ||
# which they can flush without messing up your dev db | ||
DATABASES = { | ||
'default': { | ||
'ENGINE': 'django.db.backends.sqlite3', | ||
'NAME': TEST_ROOT / "db" / "test_mitx.db", | ||
'TEST_NAME': TEST_ROOT / "db" / "test_mitx.db", | ||
} | ||
} | ||
|
||
# Include the lettuce app for acceptance testing, including the 'harvest' django-admin command | ||
INSTALLED_APPS += ('lettuce.django',) | ||
LETTUCE_APPS = ('contentstore',) | ||
LETTUCE_SERVER_PORT = random.randint(1024, 65535) | ||
LETTUCE_BROWSER = 'chrome' |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,6 +17,9 @@ | |
# These names aren't used, but do important work on import. | ||
from lms import one_time_startup # pylint: disable=W0611 | ||
from cms import one_time_startup # pylint: disable=W0611 | ||
from pymongo import MongoClient | ||
import xmodule.modulestore.django | ||
from xmodule.contentstore.django import _CONTENTSTORE | ||
|
||
# There is an import issue when using django-staticfiles with lettuce | ||
# Lettuce assumes that we are using django.contrib.staticfiles, | ||
|
@@ -87,6 +90,22 @@ def reset_data(scenario): | |
LOGGER.debug("Flushing the test database...") | ||
call_command('flush', interactive=False) | ||
|
||
|
||
@after.each_scenario | ||
def reset_databases(scenario): | ||
''' | ||
After each scenario, all databases are cleared/dropped. Contentstore data are stored in unique databases | ||
whereas modulestore data is in unique collection names. This data is created implicitly during the scenarios. | ||
If no data is created during the test, these lines equivilently do nothing. | ||
''' | ||
mongo = MongoClient() | ||
mongo.drop_database(settings.CONTENTSTORE['OPTIONS']['db']) | ||
_CONTENTSTORE.clear() | ||
modulestore = xmodule.modulestore.django.modulestore() | ||
modulestore.collection.drop() | ||
xmodule.modulestore.django._MODULESTORES.clear() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These lines need comments. Specifically, why are we dropping the database in one case (the content store) but dropping collections in the other (the module store)? |
||
|
||
|
||
# Uncomment below to trigger a screenshot on error | ||
# @after.each_scenario | ||
def screenshot_on_error(scenario): | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
""" | ||
This config file extends the test environment configuration | ||
so that we can run the lettuce acceptance tests. | ||
""" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Explain why we need to do this. Something like that we want the same settings as acceptance.py except for the db or collection names, because otherwise any call to django-admin (including collectstatic) will create another uniquely named one. |
||
|
||
# We intentionally define lots of variables that aren't used, and | ||
# want to import all variables from base settings files | ||
# pylint: disable=W0401, W0614 | ||
|
||
from .test import * | ||
|
||
# You need to start the server in debug mode, | ||
# otherwise the browser will not render the pages correctly | ||
DEBUG = True | ||
|
||
# Disable warnings for acceptance tests, to make the logs readable | ||
import logging | ||
logging.disable(logging.ERROR) | ||
import random | ||
|
||
# Use the mongo store for acceptance tests | ||
modulestore_options = { | ||
'default_class': 'xmodule.raw_module.RawDescriptor', | ||
'host': 'localhost', | ||
'db': 'acceptance_xmodule', | ||
'collection': 'acceptance_modulestore', | ||
'fs_root': TEST_ROOT / "data", | ||
'render_template': 'mitxmako.shortcuts.render_to_string', | ||
} | ||
|
||
MODULESTORE = { | ||
'default': { | ||
'ENGINE': 'xmodule.modulestore.mongo.MongoModuleStore', | ||
'OPTIONS': modulestore_options | ||
}, | ||
'direct': { | ||
'ENGINE': 'xmodule.modulestore.mongo.MongoModuleStore', | ||
'OPTIONS': modulestore_options | ||
} | ||
} | ||
|
||
CONTENTSTORE = { | ||
'ENGINE': 'xmodule.contentstore.mongo.MongoContentStore', | ||
'OPTIONS': { | ||
'host': 'localhost', | ||
'db': 'acceptance_xcontent', | ||
} | ||
} | ||
|
||
# Set this up so that rake lms[acceptance] and running the | ||
# harvest command both use the same (test) database | ||
# which they can flush without messing up your dev db | ||
DATABASES = { | ||
'default': { | ||
'ENGINE': 'django.db.backends.sqlite3', | ||
'NAME': TEST_ROOT / "db" / "test_mitx.db", | ||
'TEST_NAME': TEST_ROOT / "db" / "test_mitx.db", | ||
} | ||
} | ||
|
||
# Set up XQueue information so that the lms will send | ||
# requests to a mock XQueue server running locally | ||
XQUEUE_PORT = random.randint(1024, 65535) | ||
XQUEUE_INTERFACE = { | ||
"url": "http://127.0.0.1:%d" % XQUEUE_PORT, | ||
"django_auth": { | ||
"username": "lms", | ||
"password": "***REMOVED***" | ||
}, | ||
"basic_auth": ('anant', 'agarwal'), | ||
} | ||
|
||
# Do not display the YouTube videos in the browser while running the | ||
# acceptance tests. This makes them faster and more reliable | ||
MITX_FEATURES['STUB_VIDEO_FOR_TESTING'] = True | ||
|
||
# Include the lettuce app for acceptance testing, including the 'harvest' django-admin command | ||
INSTALLED_APPS += ('lettuce.django',) | ||
LETTUCE_APPS = ('courseware',) | ||
LETTUCE_SERVER_PORT = random.randint(1024, 65535) | ||
LETTUCE_BROWSER = 'chrome' |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -80,7 +80,9 @@ TEST_TASK_DIRS = [] | |
|
||
# Run acceptance tests | ||
desc "Run acceptance tests" | ||
task "test_acceptance_#{system}", [:harvest_args] => [:clean_test_files, "#{system}:gather_assets:acceptance", "fasttest_acceptance_#{system}"] | ||
#gather_assets uses its own env because acceptance contains seeds to make the information unique | ||
#acceptance_static is acceptance without the random seeding | ||
task "test_acceptance_#{system}", [:harvest_args] => [:clean_test_files, "#{system}:gather_assets:acceptance_static", "fasttest_acceptance_#{system}"] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add in a comment explaining why we did this, so that we remember and other people know why too. |
||
|
||
desc "Run acceptance tests without collectstatic" | ||
task "fasttest_acceptance_#{system}", [:harvest_args] => [report_dir, :clean_reports_dir, :predjango] do |t, args| | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where does the database get created in the first place?
What happens if the database does not exist? Does
mongo.drop_database()
throw an exception?