def on_submit(self, request):
        question_name = ''
        lang = ''
        code = ''
        test = ''
        execution_result = ''
        if request.method == 'POST':
            question_name = request.form['question_name']
            lang = request.form['language']
            code = request.form['code']
            test = request.form['test']

            if lang.lower() == 'python':
                py_packager = PythonPackager(self.configs)
                bundle = py_packager.bundle(question_name, code, test)

                execution_result = py_packager.execute(bundle)
            else:
                raise PackagerException("Unexpected language type.")

        got_data = {
            'language': lang,
            'code': code,
            'test': test,
            'question_name': question_name
        }
        response_payload = {
            'execution_result': execution_result,
            'got_data': got_data
        }
        # dispatch_request expects any response object or throws an exception
        return Response(json.dumps(response_payload), mimetype='text/json')
    def test_bundle_code_and_test_then_execute(self):
        self.maxDiff = None
        # uncomment this to let unittest print unlimited stacktraces
        # self.maxDiff = None
        test_question_name = "foo"
        with open(self.get_file('code'), 'r') as code, \
                open(self.get_file('tests'), 'r') as test:
            p = PythonPackager(self.packager_config)
            bundle = p.bundle(test_question_name, code.read(), test.read())

            code_file = bundle.code_file_path
            test_file = bundle.test_file_path

            self.assertTrue(os.path.exists(code_file))
            self.assertTrue(os.path.exists(test_file))

            with open(test_file, 'r') as test_out, \
                    open(self.get_file('expected_test_str'),
                         'r') as expected_test, \
                    open(code_file, 'r') as code_out, \
                    open(self.get_file('expected_code_str'),
                         'r') as expected_code:

                # cache it to use later
                expected_test_str = expected_test.read()
                expected_code_str = expected_code.read()
                got_test_str = test_out.read()
                got_code_str = code_out.read()

                self.assertEqual(''.join(got_test_str.split()),
                                 ''.join(expected_test_str.split()),
                                 msg='got {} not equal to {}'
                                 .format(got_test_str,
                                         expected_test_str))

                self.assertEqual(''.join(got_code_str.split()),
                                 ''.join(expected_code_str.split()),
                                 msg='got {} not equal to {}'
                                 .format(len(got_code_str),
                                         len(expected_code_str)),)

                exp_test_cases = yaml.load(expected_test_str)
                got_test_cases = Packager.parse_testcases(bundle)

                self.assertEqual(got_test_cases, exp_test_cases)

            got_test_output = p.execute(bundle)
            exp_test_output = {
                "testSimple": {"success": True, "message": None},
                "testMultiSimple": {"success": True, "message": None}
            }

            self.assertEqual(got_test_output, exp_test_output)
    def test_compile_failure(self):
        test_question_name = "foo_compile_fail"
        with open(self.get_file('compilation_error'), 'r') as code, \
                open(self.get_file('tests'), 'r') as test:
            p = PythonPackager(self.packager_config)
            bundle = p.bundle(test_question_name, code.read(), test.read())

            got_test_output = p.execute(bundle)

            for testcase, test_case_result in got_test_output.items():
                self.assertFalse(test_case_result['success'])
                self.assertIsNotNone(test_case_result['message'])
    def test_test_case_failure(self):
        test_question_name = "foo_test_fail"
        with open(self.get_file('code'), 'r') as code, \
                open(self.get_file('failing_tests'), 'r') as test:
            p = PythonPackager(self.packager_config)
            bundle = p.bundle(test_question_name, code.read(), test.read())

            got_test_output = p.execute(bundle)
            exp_test_output = {
                "testFail": {
                    "success": False,
                    "message": "Got Output: 6\nExpected Output: 2\n"
                }
            }

            self.assertEqual(got_test_output, exp_test_output)