diff --git a/lms/djangoapps/courseware/tests/__init__.py b/lms/djangoapps/courseware/tests/__init__.py
index e69de29bb2..dd3c4dc2b3 100644
--- a/lms/djangoapps/courseware/tests/__init__.py
+++ b/lms/djangoapps/courseware/tests/__init__.py
@@ -0,0 +1,97 @@
+"""
+integration tests for xmodule
+
+Contains:
+
+ 1. BaseTestXmodule class provides course and users
+ for testing Xmodules with mongo store.
+"""
+
+from django.test.utils import override_settings
+from django.core.urlresolvers import reverse
+from django.test.client import Client
+
+from student.tests.factories import UserFactory, CourseEnrollmentFactory
+from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE
+from xmodule.modulestore import Location
+from xmodule.modulestore.django import modulestore
+from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
+from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
+
+
+@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE)
+class BaseTestXmodule(ModuleStoreTestCase):
+ """Base class for testing Xmodules with mongo store.
+
+ This class prepares course and users for tests:
+ 1. create test course
+ 2. create, enrol and login users for this course
+
+ Any xmodule should overwrite only next parameters for test:
+ 1. TEMPLATE_NAME
+ 2. DATA
+ 3. COURSE_DATA and USER_COUNT if needed
+
+ This class should not contain any tests, because TEMPLATE_NAME
+ should be defined in child class.
+ """
+ USER_COUNT = 2
+ COURSE_DATA = {}
+
+ # Data from YAML common/lib/xmodule/xmodule/templates/NAME/default.yaml
+ TEMPLATE_NAME = ""
+ DATA = {}
+
+ def setUp(self):
+
+ self.course = CourseFactory.create(data=self.COURSE_DATA)
+
+ # Turn off cache.
+ modulestore().request_cache = None
+ modulestore().metadata_inheritance_cache_subsystem = None
+
+ chapter = ItemFactory.create(
+ parent_location=self.course.location,
+ template="i4x://edx/templates/sequential/Empty",
+ )
+ section = ItemFactory.create(
+ parent_location=chapter.location,
+ template="i4x://edx/templates/sequential/Empty"
+ )
+
+ # username = robot{0}, password = 'test'
+ self.users = [
+ UserFactory.create(username='robot%d' % i, email='robot+test+%d@edx.org' % i)
+ for i in range(self.USER_COUNT)
+ ]
+
+ for user in self.users:
+ CourseEnrollmentFactory.create(user=user, course_id=self.course.id)
+
+ item = ItemFactory.create(
+ parent_location=section.location,
+ template=self.TEMPLATE_NAME,
+ data=self.DATA
+ )
+ self.item_url = Location(item.location).url()
+
+ # login all users for acces to Xmodule
+ self.clients = {user.username: Client() for user in self.users}
+ self.login_statuses = [
+ self.clients[user.username].login(
+ username=user.username, password='test')
+ for user in self.users
+ ]
+
+ self.assertTrue(all(self.login_statuses))
+
+ def get_url(self, dispatch):
+ """Return word cloud url with dispatch."""
+ return reverse(
+ 'modx_dispatch',
+ args=(self.course.id, self.item_url, dispatch)
+ )
+
+ def tearDown(self):
+ for user in self.users:
+ user.delete()
diff --git a/lms/djangoapps/courseware/tests/test_video_mongo.py b/lms/djangoapps/courseware/tests/test_video_mongo.py
new file mode 100644
index 0000000000..f979ae2686
--- /dev/null
+++ b/lms/djangoapps/courseware/tests/test_video_mongo.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+"""Video xmodule tests in mongo."""
+
+import json
+
+from . import BaseTestXmodule
+
+
+class TestVideo(BaseTestXmodule):
+ """Integration tests: web client + mongo."""
+
+ TEMPLATE_NAME = "i4x://edx/templates/video/default"
+ DATA = ''
+
+ def test_handle_ajax_correct_dispatch(self):
+ responses = {
+ user.username: self.clients[user.username].post(
+ self.get_url('goto_position'),
+ {'position': 10},
+ HTTP_X_REQUESTED_WITH='XMLHttpRequest')
+ for user in self.users
+ }
+
+ response_contents = {
+ username: json.loads(response.content) for username, response in
+ responses.items()
+ }
+
+ self.assertTrue(
+ all([
+ content['success']
+ for _, content in response_contents.items()
+ ]))
+
+ def test_handle_ajax_incorrect_dispatch(self):
+ responses = {
+ user.username: self.clients[user.username].post(
+ self.get_url('whatever'),
+ {},
+ HTTP_X_REQUESTED_WITH='XMLHttpRequest')
+ for user in self.users
+ }
+
+ self.assertEqual(
+ set([
+ response.status_code
+ for _, response in responses.items()
+ ]).pop(),
+ 404)
diff --git a/lms/djangoapps/courseware/tests/test_video_xml.py b/lms/djangoapps/courseware/tests/test_video_xml.py
new file mode 100644
index 0000000000..da63db55a9
--- /dev/null
+++ b/lms/djangoapps/courseware/tests/test_video_xml.py
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+"""Test for Video Xmodule functional logic.
+These tests data readed from xml, not from mongo.
+
+We have a ModuleStoreTestCase class defined in
+common/lib/xmodule/xmodule/modulestore/tests/django_utils.py.
+You can search for usages of this in the cms and lms tests for examples.
+You use this so that it will do things like point the modulestore
+setting to mongo, flush the contentstore before and after, load the
+templates, etc.
+You can then use the CourseFactory and XModuleItemFactory as defined in
+common/lib/xmodule/xmodule/modulestore/tests/factories.py to create the
+course, section, subsection, unit, etc.
+"""
+
+import json
+import unittest
+from mock import Mock
+from lxml import etree
+
+from xmodule.video_module import VideoDescriptor, VideoModule
+from xmodule.modulestore import Location
+from xmodule.tests import test_system
+from xmodule.tests.test_logic import LogicTest
+
+
+class VideoFactory(object):
+ """A helper class to create video modules with various parameters
+ for testing.
+ """
+
+ # tag that uses youtube videos
+ sample_problem_xml_youtube = """
+
+ """
+
+ @staticmethod
+ def create():
+ """Method return Video Xmodule instance."""
+ location = Location(["i4x", "edX", "video", "default",
+ "SampleProblem{0}".format(1)])
+ model_data = {'data': VideoFactory.sample_problem_xml_youtube}
+
+ descriptor = Mock(weight="1")
+
+ system = test_system()
+ system.render_template = lambda template, context: context
+ module = VideoModule(system, location, descriptor, model_data)
+
+ return module
+
+
+class VideoModuleLogicTest(LogicTest):
+ """Tests for logic of Video Xmodule."""
+
+ descriptor_class = VideoDescriptor
+
+ raw_model_data = {
+ 'data': ''
+ }
+
+ def test_get_timeframe_no_parameters(self):
+ """Make sure that timeframe() works correctly w/o parameters"""
+ xmltree = etree.fromstring('')
+ output = self.xmodule._get_timeframe(xmltree)
+ self.assertEqual(output, ('', ''))
+
+ def test_get_timeframe_with_one_parameter(self):
+ """Make sure that timeframe() works correctly with one parameter"""
+ xmltree = etree.fromstring(
+ ''
+ )
+ output = self.xmodule._get_timeframe(xmltree)
+ self.assertEqual(output, (247, ''))
+
+ def test_get_timeframe_with_two_parameters(self):
+ """Make sure that timeframe() works correctly with two parameters"""
+ xmltree = etree.fromstring(
+ ''''''
+ )
+ output = self.xmodule._get_timeframe(xmltree)
+ self.assertEqual(output, (247, 47079))
+
+
+class VideoModuleUnitTest(unittest.TestCase):
+ """Unit tests for Video Xmodule."""
+
+ def test_video_constructor(self):
+ """Make sure that all parameters extracted correclty from xml"""
+ module = VideoFactory.create()
+
+ # `get_html` return only context, cause we
+ # overwrite `system.render_template`
+ context = module.get_html()
+ expected_context = {
+ 'track': None,
+ 'show_captions': 'true',
+ 'display_name': 'SampleProblem1',
+ 'id': 'i4x-edX-video-default-SampleProblem1',
+ 'end': 3610.0,
+ 'caption_asset_path': '/static/subs/',
+ 'source': '.../mit-3091x/M-3091X-FA12-L21-3_100.mp4',
+ 'streams': '0.75:jNCf2gIqpeE,1.0:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg',
+ 'normal_speed_video_id': 'ZwkTiUPN0mg',
+ 'position': 0,
+ 'start': 3603.0
+ }
+ self.assertDictEqual(context, expected_context)
+
+ self.assertEqual(
+ module.youtube,
+ '0.75:jNCf2gIqpeE,1.0:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg')
+
+ self.assertEqual(
+ module.video_list(),
+ module.youtube)
+
+ self.assertEqual(
+ module.position,
+ 0)
+
+ self.assertDictEqual(
+ json.loads(module.get_instance_state()),
+ {'position': 0})
+
+ self.assertIsNone(module.get_progress())