test_export_git.py 3.62 KB
Newer Older
Carson Gee committed
1 2 3 4 5 6 7 8 9 10 11 12
"""
Test the ability to export courses to xml from studio
"""

import copy
import os
import shutil
import subprocess
from uuid import uuid4

from django.conf import settings
from django.test.utils import override_settings
13
from pymongo import MongoClient
Carson Gee committed
14 15

from .utils import CourseTestCase
16 17
import contentstore.git_export_utils as git_export_utils
from xmodule.contentstore.django import _CONTENTSTORE
Carson Gee committed
18
from xmodule.modulestore.django import modulestore
19
from contentstore.utils import get_modulestore, reverse_course_url
Carson Gee committed
20 21 22 23 24 25

TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE)
TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'] = 'test_xcontent_%s' % uuid4().hex


@override_settings(CONTENTSTORE=TEST_DATA_CONTENTSTORE)
26
class TestExportGit(CourseTestCase):
Carson Gee committed
27 28 29 30 31 32 33 34
    """
    Tests pushing a course to a git repository
    """

    def setUp(self):
        """
        Setup test course, user, and url.
        """
35
        super(TestExportGit, self).setUp()
36 37
        self.course_module = modulestore().get_course(self.course.id)
        self.test_url = reverse_course_url('export_git', self.course.id)
Carson Gee committed
38

39 40 41 42
    def tearDown(self):
        MongoClient().drop_database(TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'])
        _CONTENTSTORE.clear()

Carson Gee committed
43 44 45 46 47 48 49 50
    def test_giturl_missing(self):
        """
        Test to make sure an appropriate error is displayed
        if course hasn't set giturl.
        """
        response = self.client.get(self.test_url)
        self.assertEqual(200, response.status_code)
        self.assertIn(
51 52
            ('giturl must be defined in your '
             'course settings before you can export to git.'),
Carson Gee committed
53 54 55 56 57 58
            response.content
        )

        response = self.client.get('{}?action=push'.format(self.test_url))
        self.assertEqual(200, response.status_code)
        self.assertIn(
59 60
            ('giturl must be defined in your '
             'course settings before you can export to git.'),
Carson Gee committed
61 62 63
            response.content
        )

64
    def test_course_export_failures(self):
Carson Gee committed
65 66 67 68
        """
        Test failed course export response.
        """
        self.course_module.giturl = 'foobar'
69
        get_modulestore(self.course_module.location).update_item(self.course_module)
Carson Gee committed
70 71

        response = self.client.get('{}?action=push'.format(self.test_url))
72
        self.assertIn('Export Failed:', response.content)
Carson Gee committed
73

74 75 76 77 78 79 80 81 82 83
    def test_exception_translation(self):
        """
        Regression test for making sure errors are properly stringified
        """
        self.course_module.giturl = 'foobar'
        get_modulestore(self.course_module.location).update_item(self.course_module)

        response = self.client.get('{}?action=push'.format(self.test_url))
        self.assertNotIn('django.utils.functional.__proxy__', response.content)

84
    def test_course_export_success(self):
Carson Gee committed
85 86 87 88
        """
        Test successful course export response.
        """
        # Build out local bare repo, and set course git url to it
89
        repo_dir = os.path.abspath(git_export_utils.GIT_REPO_EXPORT_DIR)
Carson Gee committed
90 91 92 93
        os.mkdir(repo_dir)
        self.addCleanup(shutil.rmtree, repo_dir)

        bare_repo_dir = '{0}/test_repo.git'.format(
94
            os.path.abspath(git_export_utils.GIT_REPO_EXPORT_DIR))
Carson Gee committed
95 96 97 98 99
        os.mkdir(bare_repo_dir)
        self.addCleanup(shutil.rmtree, bare_repo_dir)

        subprocess.check_output(['git', '--bare', 'init', ], cwd=bare_repo_dir)

100
        self.populate_course()
Carson Gee committed
101
        self.course_module.giturl = 'file://{}'.format(bare_repo_dir)
102
        get_modulestore(self.course_module.location).update_item(self.course_module)
Carson Gee committed
103 104

        response = self.client.get('{}?action=push'.format(self.test_url))
105
        self.assertIn('Export Succeeded', response.content)