Source code for oioioi.plagiarism.tests

import six
from django.core.management import call_command
from django.core.management.base import CommandError
try:
    from mock import Mock, patch
except ImportError:
    from unittest.mock import Mock, patch

from oioioi.base.tests import TestCase
from oioioi.plagiarism.utils import MossClient, MossException

[docs]SAMPLE_RESULTS_URL = "http://moss.stanford.edu/results/10/123456789"
[docs]ALWAYS_OK_SUBMIT = Mock(return_value=SAMPLE_RESULTS_URL)
[docs]class TestMossClient(TestCase): @patch( 'oioioi.plagiarism.utils.MossClient.HOSTNAME', 'nonexistent.subdomain.moss.stanford.edu', )
[docs] def test_connection_refused(self): client = MossClient(userid=1234, lang="C++") with self.assertRaisesRegex(MossException, 'Could not connect'): client.submit()
[docs] def test_moss_query_rejection(self): # create a socket which always receives "no" mock_socket = Mock() mock_socket_ctor = Mock(return_value=mock_socket) mock_recv = Mock(return_value=six.ensure_binary("no\n")) mock_socket.recv = mock_recv with patch('socket.socket', mock_socket_ctor): client = MossClient(userid=1234, lang="C++") with self.assertRaisesRegex(MossException, 'rejected .* query'): client.submit()
[docs]class TestMossSubmitCommand(TestCase):
[docs] fixtures = [ 'test_users', 'test_contest', 'test_full_package', 'test_problem_instance', 'test_submission', 'test_another_submission', ]
@patch('oioioi.plagiarism.utils.MossClient.submit', ALWAYS_OK_SUBMIT)
[docs] def test_export(self): call_command('moss_submit', 1, '-a', '-l=C++', '-i=1234')
@patch('oioioi.plagiarism.utils.MossClient.submit', ALWAYS_OK_SUBMIT)
[docs] def test_no_submissions(self): with self.assertRaisesRegex(CommandError, 'no submissions'): call_command('moss_submit', 1, '-a', '-l=Pascal', '-i=1234')
@patch('oioioi.plagiarism.utils.MossClient.submit', ALWAYS_OK_SUBMIT)
[docs] def test_adding_files(self): with patch('oioioi.plagiarism.utils.MossClient.add_file') as mock_add_file: call_command('moss_submit', 1, '-a', '-l=C++', '-i=1234') self.assertEqual(mock_add_file.call_count, 2) display_names = {call_args[0][1] for call_args in mock_add_file.call_args_list} self.assertEqual(display_names, {"TU1001_1", "TU1001_2"})
[docs]class TestMossSubmitView(TestCase):
[docs] fixtures = [ 'test_users', 'test_contest', 'test_full_package', 'test_problem_instance', 'test_submission', ]
[docs] MOSS_SUBMIT_URL = '/c/c/moss_submit/'
@patch('oioioi.plagiarism.utils.MossClient.submit', ALWAYS_OK_SUBMIT)
[docs] def test_submit(self): self.assertTrue(self.client.login(username='test_admin')) response = self.client.get(self.MOSS_SUBMIT_URL) self.assertContains(response, 'language') self.assertContains(response, 'problem_instance') self.assertContains(response, 'only_final') self.assertContains(response, 'userid') self.assertContains(response, 'submit') response = self.client.post( self.MOSS_SUBMIT_URL, { 'problem_instance': '1', 'language': 'C++', 'userid': '1234', 'only_final': 'on', }, ) self.assertEqual(response.status_code, 302) self.assertEqual(response.url, SAMPLE_RESULTS_URL)