Esempio n. 1
0
 def test_get_podium_achievement(self):
     """Test if get correctly a podium achievement"""
     client = Client()
     podium_achievement = PodiumAchievementDefinition(
         name={"es": "Top 1"},
         description={"es": 'Se el primero'},
         num_problems=1,
         position=1)
     podium_achievement.save()
     coll = create_collection('Test Podium')
     problem = create_select_problem(coll, 'Select 1')
     user = create_user('passwordmichu', 'michu')
     client.login(username='******', password='******')
     submit_select_url = reverse('judge:submit', args=[problem.pk])
     client.post(submit_select_url, {'code': problem.solution}, follow=True)
     achievements_url = reverse('judge:achievements', args=[user.pk])
     response = client.get(achievements_url, follow=True)
     self.assertIn('Fecha', response.content.decode('utf-8'))
Esempio n. 2
0
 def test_get_collection_achievement(self):
     """Test if get correctly a collection achievement"""
     client = Client()
     coll = create_collection('Test Solved')
     coll_achievement = NumSolvedCollectionAchievementDefinition(
         name={"es": 'Solo 1'},
         description={"es": 'Acierta 1'},
         num_problems=1,
         collection=coll)
     coll_achievement.save()
     problem = create_select_problem(coll, 'Select 1')
     user = create_user('passwordmichu', 'michu')
     client.login(username='******', password='******')
     submit_select_url = reverse('judge:submit', args=[problem.pk])
     client.post(submit_select_url, {'code': problem.solution}, follow=True)
     achievements_url = reverse('judge:achievements', args=[user.pk])
     response = client.get(achievements_url, follow=True)
     self.assertIn('Fecha', response.content.decode('utf-8'))
Esempio n. 3
0
 def test_incorrect_submit_get_achievement(self):
     """Test if an incorrect submission get an achievement"""
     client = Client()
     user = create_user('passwordmazepin', 'mazepin')
     coll = create_collection('Coleccion de cartas')
     problem = create_select_problem(coll, 'Problema')
     ach_submissions = NumSubmissionsProblemsAchievementDefinition(
         name={"es": 'Un envio'},
         description={"es": 'Envia una solucion para un problema'},
         num_problems=1,
         num_submissions=1)
     ach_submissions.save()
     client.login(username='******', password='******')
     submit_select_url = reverse('judge:submit', args=[problem.pk])
     client.post(submit_select_url, {'code': 'MAL'},
                 follow=True)  # Validation Error, too short
     self.assertEqual(
         ObtainedAchievement.objects.filter(user=user).count(), 1)
Esempio n. 4
0
    def test_rejudge(self):
        """ Test that rejudge correctly detects submission whose verdict changes """
        collection = create_collection("test collection")
        problem = create_select_problem(collection, "example")
        user = create_user(passwd='1111', username='******')
        subs = [
            Submission(code=problem.solution,
                       veredict_code=VeredictCode.IE,
                       user=user,
                       problem=problem),  # IE->AC
            Submission(code='SELECT * FROM dual',
                       veredict_code=VeredictCode.IE,
                       user=user,
                       problem=problem),  # IE->WA
            Submission(code='SELECT * FRO dual',
                       veredict_code=VeredictCode.IE,
                       user=user,
                       problem=problem),  # IE->RE
        ]
        for sub in subs:
            sub.save()
            sub.creation_date = datetime.datetime(2020, 9,
                                                  15)  # Sets an older date
            sub.save()

        file_desc, filename = mkstemp('_rejudge')
        os.close(
            file_desc)  # To avoid problems when removing the file in Windows
        rejudge(VeredictCode.IE, filename, tests=True)
        with open(filename, 'r') as summary_file:
            summary = summary_file.read()
            self.assertIn('IE --> AC', summary)
            self.assertIn('IE --> WA', summary)
            self.assertIn('IE --> RE', summary)
            self.assertNotIn('IE --> IE', summary)
        os.remove(filename)
Esempio n. 5
0
    def test_download_ranking(self):
        """ Test to download excel of results """
        client = Client()
        user = create_user('2222', 'tamara')
        teacher = create_superuser('1111', 'teacher')
        group_a = create_group('1A')
        group_a.user_set.add(user)
        start = first_day_of_course(datetime(2020, 9, 1))
        end = datetime(2021, 3, 7).strftime('%Y-%m-%d')
        collection = create_collection('Coleccion 1')
        select_problem = create_select_problem(collection, 'SelectProblem ABC DEF')
        sub = Submission.objects.create(code='SELECT * FROM test where n = 1000',
                                        user=user, veredict_code=VeredictCode.WA, problem=select_problem)
        sub.save()
        Submission.objects.filter(id=sub.id).update(creation_date=datetime(2021, 3, 5))
        client.login(username=teacher.username, password='******')
        url = reverse('judge:download_ranking', args=[collection.pk])
        response = client.get(url, {'group': group_a.id, 'start': start, 'end': end}, follow=True)

        # Teacher download ranking
        self.assertEqual(
            response.get('Content-Disposition'),
            "attachment; filename=ranking.xlsx",
        )
        self.assertEqual(
            response.get('Content-Type'),
            "application/xlsx"
        )

        file = tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, suffix='.xlsx')
        cont = response.content
        file.write(cont)
        work = openpyxl.load_workbook(file)
        book = work.active
        self.assertIn("Colección: " + collection.name_md, book.cell(row=1, column=1).value)
        self.assertIn("1A", book.cell(row=3, column=1).value)
        self.assertIn("1", book.cell(row=5, column=1).value)
        self.assertIn(user.username, book.cell(row=5, column=2).value)
        self.assertIn("0/1 (1)", book.cell(row=5, column=3).value)
        self.assertIn("0", book.cell(row=5, column=4).value)
        self.assertIn("0", book.cell(row=5, column=5).value)
        file.close()

        # Date or group invalid
        response = client.get(url, {
            'group': group_a.id, 'start': start, 'end': ''}, follow=True)
        self.assertIn("Este campo es obligatorio", response.content.decode('utf-8'))
        response = client.get(url, {
            'group': group_a.id, 'start': 'eee', 'end': end}, follow=True)
        self.assertIn("Introduzca una fecha válida", response.content.decode('utf-8'))
        response = client.get(url, {
            'group': group_a.id, 'end': end}, follow=True)
        self.assertIn("Este campo es obligatorio",
                      response.content.decode('utf-8'))
        response = client.get(url,
                              {'group': '1A', 'start': start, 'end': end}, follow=True)
        self.assertIn('Introduzca un número entero', response.content.decode('utf-8'))

        # User can't download ranking
        client.logout()
        client.login(username=user.username, password='******')
        response = client.get(url, {'group': group_a.id, 'start': start, 'end': end}, follow=True)
        self.assertIn('Forbidden', response.content.decode('utf-8'))
Esempio n. 6
0
 def test_return_none(self):
     """Test if an user don't solve a problem, function solved_position return None"""
     user = create_user('passwordmichu', 'michu')
     coll = create_collection('Coleccion de cartas')
     problem = create_select_problem(coll, 'Problema')
     self.assertIsNone(problem.solved_position(user))
Esempio n. 7
0
    def test_obtained_achievements_date(self):
        """Test if the dates of the obtained achievements are correct"""
        user = create_user('passwordmichu', 'michu')
        coll = create_collection('Coleccion de cartas')
        problem_1 = create_select_problem(coll, 'Problema 1')
        problem_2 = create_select_problem(coll, 'Problema 2')
        sub_1 = Submission(code='nada', veredict_code=VeredictCode.AC, user=user, problem=problem_1)
        sub_2 = Submission(code='nada', veredict_code=VeredictCode.AC, user=user, problem=problem_2)
        sub_1.save()
        sub_2.save()
        Submission.objects.filter(id=sub_1.id).update(creation_date=datetime(2006, 3, 5))
        # sub_1_u = submission 1 updated
        sub_1_u = Submission.objects.get(id=sub_1.id)
        Submission.objects.filter(id=sub_2.id).update(creation_date=datetime(2020, 3, 5))
        sub_2_u = Submission.objects.get(id=sub_2.id)

        # Test NumSolvedAchievementDefinition
        ach_solved = NumSolvedAchievementDefinition(name='Resolvista', description='Resuelve 2 problemas',
                                                    num_problems=2)
        ach_solved.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_2_u.creation_date)
        ach_solved.num_problems = 1
        ach_solved.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_1_u.creation_date)
        ObtainedAchievement.objects.all().delete()

        # Test NumSolvedCollectionAchievementDefinition
        ach_coll = NumSolvedCollectionAchievementDefinition(name='Coleccionista', description='Resuelve 2 \
                                                            problemas de esta coleccion', num_problems=2,
                                                            collection=coll)
        ach_coll.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_2_u.creation_date)
        ach_coll.num_problems = 1
        ach_coll.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_1_u.creation_date)
        ObtainedAchievement.objects.all().delete()

        # Test PodiumAchievementDefinition
        ach_podium = PodiumAchievementDefinition(name='Presidente del podio', description='Consigue ser el primero',
                                                 num_problems=2, position=1)
        ach_podium.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_2_u.creation_date)
        ach_podium.num_problems = 1
        ach_podium.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_1_u.creation_date)
        ObtainedAchievement.objects.all().delete()

        # Test NumSolvedTypeAchievementDefinition
        ach_type = NumSolvedTypeAchievementDefinition(name='Tipos', description='Resuelve un problema SELECT',
                                                      num_problems=2, problem_type=ProblemType.SELECT.name)
        ach_type.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_2_u.creation_date)
        ach_type.num_problems = 1
        ach_type.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_1_u.creation_date)
        ObtainedAchievement.objects.all().delete()

        # Test NumSubmissionsProblemsAchievementDefinition
        ach_submissions = NumSubmissionsProblemsAchievementDefinition(name='Ya van dos problemas',
                                                                      description='Realiza un envio en dos problemas',
                                                                      num_problems=2, num_submissions=2)
        ach_submissions.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_2_u.creation_date)
        ach_submissions.num_problems = 1
        ach_submissions.num_submissions = 1
        ach_submissions.save()
        date = ObtainedAchievement.objects.filter(user=user).values_list('obtained_date', flat=True)
        self.assertEqual(date[0], sub_1_u.creation_date)
        ObtainedAchievement.objects.all().delete()
Esempio n. 8
0
 def test_signal_update_achievement(self):
     """Test for check signals"""
     # Create two users for test all the achievements. Two for the podium
     client = Client()
     user_michu = create_user('passwordmichu', 'michu')
     create_user('passwordimmobile', 'immobile')
     client.login(username='******', password='******')
     # Create the Collection for the achievement NumSolvedCollectionAchievementDefinition and Problem
     coll = create_collection('Coleccion de cartas')
     # Create PodiumAchievementDefinition
     ach_podium = PodiumAchievementDefinition(name='Presidente del podio', description='Consigue ser el primero',
                                              num_problems=1, position=1)
     ach_podium.save()
     # Create NumSolvedCollectionAchievementDefinition
     ach_collection = NumSolvedCollectionAchievementDefinition(name='Coleccionista', description='Resuelve 50\
                                                               problemas de esta coleccion', num_problems=50,
                                                               collection=coll)
     ach_collection.save()
     # Create NumSolvedAchievementDefinition
     ach_solved = NumSolvedAchievementDefinition(name='Resolvista', description='Resuelve 50 problemas',
                                                 num_problems=50)
     ach_solved.save()
     # Create NumSolvedTypeAchievementDefinition
     ach_type = NumSolvedTypeAchievementDefinition(name='Procedista', description='Resuelve un problema PROC',
                                                   num_problems=1, problem_type=ProblemType.PROC.name)
     ach_type.save()
     # Create NumSubmissionsProblemsAchievementDefinition
     ach_submi_pro = NumSubmissionsProblemsAchievementDefinition(name='Muchos envios',
                                                                 description='Envia muchas soluciones',
                                                                 num_submissions=80, num_problems=1)
     ach_submi_pro.save()
     # Create problem and submit correct answer with "immobile" user, for make this the first to solve the problem
     problem = create_select_problem(coll, 'Problema')
     submit_select_url = reverse('judge:submit', args=[problem.pk])
     client.post(submit_select_url, {'code': problem.solution}, follow=True)
     client.logout()
     # Login with "michu" and submit correct answer. All the checks will be with this user
     client.login(username='******', password='******')
     client.post(submit_select_url, {'code': problem.solution}, follow=True)
     # Whit this definitions our user "michu" don't have any achievement
     self.assertEqual(ObtainedAchievement.objects.filter(user=user_michu).count(), 0)
     # PodiumAchievementDefinition now only need to stay in podium
     # In this test our user "michu" stay at second position, that is why before he didn't have the achievement
     ach_podium.position = 3
     ach_podium.save()
     # NumSolvedCollectionAchievementDefinition only needs one correct submission
     # In this test our user only have one correct submission, that is why before he didn't have the achievement
     ach_collection.num_problems = 1
     ach_collection.save()
     # NumSolvedAchievementDefinition only needs one correct submission
     # In this test our user only have one correct submission, that is why before he didn't have the achievement
     ach_solved.num_problems = 1
     ach_solved.save()
     # NumSolvedTypeAchievementDefinition change to type SELECT
     # In this test our user only resolved a SELECT type problem, not PROC.
     ach_type.problem_type = ProblemType.SELECT.name
     ach_type.save()
     # NumSubmissionsProblemsAchievementDefinition only needs one submission now
     ach_submi_pro.num_submissions = 1
     ach_submi_pro.save()
     # Now our user "michu" have 5 achievements
     self.assertEqual(ObtainedAchievement.objects.filter(user=user_michu).count(), 5)
Esempio n. 9
0
    def test_all_submissions(self):
        """ Test the list [epoch, count] for different types of verdicts and days, and also the counter of submissions
        """
        collection = create_collection('Test for statistics')
        problem = create_select_problem(collection, 'Dummy for statistics')
        user1 = create_user('0000', 'ana')
        user2 = create_user('0000', 'juan')

        subs = [
            Submission(veredict_code=VeredictCode.AC, user=user1, problem=problem),
            Submission(veredict_code=VeredictCode.WA, user=user2, problem=problem),
            Submission(veredict_code=VeredictCode.RE, user=user2, problem=problem),
            Submission(veredict_code=VeredictCode.TLE, user=user2, problem=problem),
            Submission(veredict_code=VeredictCode.VE, user=user1, problem=problem),
            Submission(veredict_code=VeredictCode.AC, user=user2, problem=problem),
        ]
        dates = [
            datetime(2020, 2, 12, 0, 0, 0, 0, tzinfo=pytz.utc),
            datetime(2020, 2, 12, 0, 0, 0, 0, tzinfo=pytz.utc),
            datetime(2020, 2, 15, 0, 0, 0, 0, tzinfo=pytz.utc),
            datetime(2020, 2, 15, 0, 0, 0, 0, tzinfo=pytz.utc),
            datetime(2020, 2, 16, 0, 0, 0, 0, tzinfo=pytz.utc),
            datetime(2020, 2, 20, 0, 0, 0, 0, tzinfo=pytz.utc),
        ]
        dates_epoch_ms = [int(date.timestamp()) * 1000 for date in dates]

        for (sub, date) in zip(subs, dates):
            sub.save()
            sub.creation_date = date
            sub.save()  # Overwrites date, because it is automatically set to 'now' in the first save

        count_all = submissions_by_day()
        self.assertEqual(len(count_all), (dates[-1] - dates[0]).days + 1)  # 9 days between first and last submission
        self.assertEqual(count_all[0], [dates_epoch_ms[0], 2])  # 2 submissions on 1st day (2020-2-12)
        self.assertEqual(count_all[1][1], 0)                    # 0 submissions on 2nd day
        self.assertEqual(count_all[2][1], 0)                    # 0 submissions on 3rd day
        self.assertEqual(count_all[3], [dates_epoch_ms[2], 2])  # 2 submissions on 4th day (2020-2-15)
        self.assertEqual(count_all[4], [dates_epoch_ms[4], 1])  # 1 submission on 5th day (2020-2-16)
        self.assertEqual(count_all[6][1], 0)                    # 0 submissions on 3rd day
        self.assertEqual(count_all[8], [dates_epoch_ms[5], 1])  # 1 submission on 9th day (2020-2-20)

        count_ac = submissions_by_day(verdict_code=VeredictCode.AC)
        self.assertEqual(len(count_ac), (dates[-1] - dates[0]).days + 1)  # 9 days between first and last AC submission
        self.assertEqual(count_ac[0], [dates_epoch_ms[0], 1])  # 1 AC submissions on 1st day (2020-2-12)
        self.assertEqual(count_ac[1][1], 0)                    # 0 submissions on 2nd day
        self.assertEqual(count_ac[4][1], 0)                    # 0 submission on 5th day (2020-2-16)
        self.assertEqual(count_ac[8], [dates_epoch_ms[5], 1])  # 1 submission on 9th day (2020-2-20)

        count_wa = submissions_by_day(verdict_code=VeredictCode.WA)
        self.assertEqual(len(count_wa), 1)  # Only one entry
        count_wa = submissions_by_day(verdict_code=VeredictCode.WA, start=dates_epoch_ms[0], end=dates_epoch_ms[-1])
        self.assertEqual(len(count_wa), (dates[-1] - dates[0]).days + 1)  # 9 days when forcing the start-end

        count_re = submissions_by_day(verdict_code=VeredictCode.RE)
        self.assertEqual(len(count_re), 1)  # Only one entry
        count_re = submissions_by_day(verdict_code=VeredictCode.RE, start=dates_epoch_ms[0], end=dates_epoch_ms[-1])
        self.assertEqual(len(count_re), (dates[-1] - dates[0]).days + 1)  # 9 days when forcing the start-end
        self.assertEqual(count_re[0], [dates_epoch_ms[0], 0])  # 0 RE submissions on 1st day (2020-2-12)
        self.assertEqual(count_re[3], [dates_epoch_ms[2], 1])  # 1 submissions on 4th day
        self.assertEqual(count_re[8], [dates_epoch_ms[5], 0])  # 0 RE submission on 9th day (2020-2-20)

        # Test the counter of submissions
        sub_count = submission_count()
        self.assertEqual(sub_count['all'], 6)
        self.assertEqual(sub_count[VeredictCode.AC], 2)
        self.assertEqual(sub_count[VeredictCode.WA], 1)
        self.assertEqual(sub_count[VeredictCode.RE], 1)
        self.assertEqual(sub_count[VeredictCode.TLE], 1)
        self.assertEqual(sub_count[VeredictCode.VE], 1)
        self.assertEqual(sub_count[VeredictCode.IE], 0)
Esempio n. 10
0
    def test_achievement_language(self):
        """Test to check the correct language display of achievements"""
        client = Client()
        solved_achievement_1 = NumSolvedAchievementDefinition(
            name={
                "es": 'Nombre1',
                "en": 'Name1'
            },
            description={
                "es": 'Descripción1',
                "en": 'Description1'
            },
            num_problems=1)
        solved_achievement_2 = NumSolvedAchievementDefinition(
            name={
                "es": 'Nombre2',
                "en": 'Name2'
            },
            description={
                "es": 'Descripción2',
                "en": 'Description2'
            },
            num_problems=2)
        solved_achievement_3 = NumSolvedAchievementDefinition(
            name={"es": 'Nombre3'},
            description={"es": 'Descripción3'},
            num_problems=3)
        solved_achievement_1.save()
        solved_achievement_2.save()
        solved_achievement_3.save()
        coll = create_collection('Achievements')
        problem = create_select_problem(coll, 'Select1')
        user = create_user('5555', 'pepe')
        client.login(username='******', password='******')
        submit_select_url = reverse('judge:submit', args=[problem.pk])
        client.post(submit_select_url, {'code': problem.solution}, follow=True)
        client.post(submit_select_url, {'code': problem.solution}, follow=True)

        client.cookies.load({settings.LANGUAGE_COOKIE_NAME: 'en'})
        achievements_url = reverse('judge:achievements', args=[user.pk])
        response = client.get(achievements_url, follow=True)
        self.assertIn('Date', response.content.decode('utf-8'))
        self.assertIn('Pending achievements', response.content.decode('utf-8'))
        self.assertIn('Name1', response.content.decode('utf-8'))
        self.assertIn('Name2', response.content.decode('utf-8'))
        self.assertIn('Nombre3', response.content.decode('utf-8'))
        self.assertIn('Description1', response.content.decode('utf-8'))
        self.assertIn('Description2', response.content.decode('utf-8'))
        self.assertIn('Descripción3', response.content.decode('utf-8'))

        client.cookies.load({settings.LANGUAGE_COOKIE_NAME: 'es'})
        achievements_url = reverse('judge:achievements', args=[user.pk])
        response = client.get(achievements_url, follow=True)
        self.assertIn('Fecha', response.content.decode('utf-8'))
        self.assertIn('Logros pendientes', response.content.decode('utf-8'))
        self.assertIn('Nombre1', response.content.decode('utf-8'))
        self.assertIn('Nombre2', response.content.decode('utf-8'))
        self.assertIn('Nombre3', response.content.decode('utf-8'))
        self.assertIn('Descripción1', response.content.decode('utf-8'))
        self.assertIn('Descripción2', response.content.decode('utf-8'))
        self.assertIn('Descripción3', response.content.decode('utf-8'))
Esempio n. 11
0
    def test_collection_languages(self):
        """Test to check languages in collection list"""
        client = Client()
        collection = create_collection('Collection')
        create_user('5555', 'pepe')
        client.login(username='******', password='******')

        create = 'CREATE TABLE mytable (dd DATE);'
        insert = "INSERT INTO mytable VALUES (TO_DATE('2020/01/31', 'yyyy/mm/dd'))"
        solution = 'SELECT * FROM mytable'
        problem1 = SelectProblem(title_md='Dates',
                                 text_md='Example with dates',
                                 language="es",
                                 create_sql=create,
                                 insert_sql=insert,
                                 collection=collection,
                                 solution=solution)
        problem2 = SelectProblem(title_md='Dates',
                                 text_md='Example with dates',
                                 language="es",
                                 create_sql=create,
                                 insert_sql=insert,
                                 collection=collection,
                                 solution=solution)
        problem1.clean()
        problem1.save()
        problem2.clean()
        problem2.save()

        self.assertIn("es", collection.languages())
        self.assertNotIn("en", collection.languages())

        collections_url = reverse('judge:collections')
        html = client.get(collections_url, follow=True).content.decode('utf-8')
        soup = BeautifulSoup(html, 'html.parser')

        self.assertEqual(
            soup.find_all("div", {"class": "flags"})[0].find_all(
                "span", {"flag-icon"}), [])

        problem3 = SelectProblem(title_md='Dates',
                                 text_md='Example with dates',
                                 language="en",
                                 create_sql=create,
                                 insert_sql=insert,
                                 collection=collection,
                                 solution=solution)
        problem3.clean()
        problem3.save()

        self.assertIn("es", collection.languages())
        self.assertIn("en", collection.languages())

        collections_url = reverse('judge:collections')
        html = client.get(collections_url, follow=True).content.decode('utf-8')
        soup = BeautifulSoup(html, 'html.parser')

        self.assertEqual(
            len(
                soup.find_all("div", {"class": "flags"})[0].find_all(
                    "span", {"flag-icon"})), 2)

        flags = soup.find_all("div", {"class": "flags"})[0].find_all(
            "span", {"flag-icon"})[0]['class']
        flags.extend(
            soup.find_all("div", {"class": "flags"})[0].find_all(
                "span", {"flag-icon"})[1]['class'])

        self.assertIn("flag-icon-us", flags)
        self.assertIn("flag-icon-es", flags)
Esempio n. 12
0
    def test_feedback_language(self):
        """Test to check language in feedback"""
        client = Client()
        collection = create_collection('Colleccion de prueba XYZ')
        select_problem = create_select_problem(collection,
                                               'SelectProblem ABC DEF')
        create_user('5555', 'pedro')
        client.login(username='******', password='******')

        expected = {
            'header': [['Algo', "<class 'cx_Oracle.NUMBER'>"],
                       ['name', "<class 'cx_Oracle.STRING'>"]],
            'rows': [[1, 'a'], [2, 'b']]
        }
        obtained1 = {
            'header': [['name', "<class 'cx_Oracle.STRING'>"],
                       ['Algo', "<class 'cx_Oracle.NUMBER'>"]],
            'rows': [['b', 2], ['a', 1]]
        }
        obtained2 = {
            'header': [['Algo', "<class 'cx_Oracle.NUMBER'>"],
                       ['name', "<class 'cx_Oracle.STRING'>"],
                       ['name', "<class 'cx_Oracle.STRING'>"]],
            'rows': [[1, 'a', 'a'], [2, 'b', 'b']]
        }
        select_problem = create_select_problem(collection,
                                               'SelectProblem ABC DEF')

        client.cookies.load({settings.LANGUAGE_COOKIE_NAME: 'en'})

        submit_url_select = reverse('judge:submit', args=[select_problem.pk])
        response = client.post(
            submit_url_select,
            {'code': f'{select_problem.solution}; {select_problem.solution}'},
            follow=True)
        self.assertIn('Exactly expected 1 SQL statement',
                      response.content.decode('utf-8'))

        self.assertIn("Expected: 2 columns",
                      compare_select_results(expected, obtained2, True)[1])
        self.assertIn("Generated by your SQL code: 3 columns",
                      compare_select_results(expected, obtained2, True)[1])
        self.assertIn("Number of columns obtained:",
                      compare_select_results(expected, obtained2, True)[1])

        self.assertIn("name of the 1th column",
                      compare_select_results(expected, obtained1, False)[1])
        self.assertIn("Expected name: Algo",
                      compare_select_results(expected, obtained1, False)[1])
        self.assertIn("Generated name by your SQL code: name",
                      compare_select_results(expected, obtained1, False)[1])

        client.cookies.load({settings.LANGUAGE_COOKIE_NAME: 'es'})

        submit_url_select = reverse('judge:submit', args=[select_problem.pk])
        response = client.post(
            submit_url_select,
            {'code': f'{select_problem.solution}; {select_problem.solution}'},
            follow=True)
        self.assertIn('Se esperaba exactamente 1 sentencia SQL',
                      response.content.decode('utf-8'))

        self.assertIn("Esperado: 2 columnas",
                      compare_select_results(expected, obtained2, True)[1])
        self.assertIn("Generado por tu código SQL: 3 columnas",
                      compare_select_results(expected, obtained2, True)[1])
        self.assertIn("Número de columnas obtenidas:",
                      compare_select_results(expected, obtained2, True)[1])

        self.assertIn("nombre de la 1ª columna",
                      compare_select_results(expected, obtained1, False)[1])
        self.assertIn("Nombre esperado: Algo",
                      compare_select_results(expected, obtained1, False)[1])
        self.assertIn("Nombre generado por tu código SQL: name",
                      compare_select_results(expected, obtained1, False)[1])
Esempio n. 13
0
    def test_compile_error(self):
        """Submitting code for a function/procedure/trigger with a compile error does resturn a
        OracleStatusCode.COMPILATION_ERROR"""
        curr_path = os.path.dirname(__file__)
        zip_function_path = os.path.join(curr_path, ParseTest.ZIP_FOLDER,
                                         ParseTest.FUNCTION_OK)
        zip_proc_path = os.path.join(curr_path, ParseTest.ZIP_FOLDER,
                                     ParseTest.PROC_OK)
        zip_trigger_path = os.path.join(curr_path, ParseTest.ZIP_FOLDER,
                                        ParseTest.TRIGGER_OK)

        client = Client()
        collection = create_collection('Colleccion de prueba AAA')
        user = create_user('54522', 'antonio')
        client.login(username='******', password='******')

        function_problem = FunctionProblem(zipfile=zip_function_path,
                                           collection=collection,
                                           author=user)
        proc_problem = ProcProblem(zipfile=zip_proc_path,
                                   collection=collection,
                                   author=user)
        trigger_problem = TriggerProblem(zipfile=zip_trigger_path,
                                         collection=collection,
                                         author=user)

        funct_compile_error = """
                            CREATE OR REPLACE FUNCTION golesLocal(resultado VARCHAR2) RETURN NUMBER IS
                              posGuion NUMBER;
                              golesStr VARCHAR2(3);
                            BEGIN
                              posGuion := INSTR(resultado, '-') -- Missing ';'
                              golesStr := SUBSTR(resultado, 0, posGuion - 1);
                              RETURN TO_NUMBER(golesStr); 
                            END;"""
        proc_compile_error = """
            CREATE OR REPLACE PROCEDURE actualiza_socios(club_cif CHAR) IS
                CURSOR cr_partidos IS SELECT CL.Nombre AS ClubL, CV.Nombre AS ClubV, COUNT(*) AS NAsistentes
                                      FROM Enfrenta JOIN Asiste USING(CIF_local, CIF_visitante)
                                           JOIN Club CL ON CL.CIF = CIF_Local
                                           JOIN Club CV ON CV.CIF = CIF_visitante
                                      WHERE CIF_local = club_cif OR CIF_visitante = club_cif
                                      GROUP BY CIF_local, CIF_visitante, CL.Nombre, CV.Nombre;
                incrPartido NUMBER;
                incrTotal NUMBER := 0;
                nPartido NUMBER := 1;
                nombreClub VARCHAR2(200);
            BEGIN
                SELECT Nombre 
                INTO nombreClub
                FROM Club
                WHERE CIF = club_cif;
        
                FOR partido IN cr_partidos LOOP
                  IF partido.NAsistentes > 3 THEN
                    incrPartido := 100;
                  ELSIF partido.NAsistentes > 1 -- Missing 'THEN'
                    incrPartido := 10;
                  ELSE 
                    incrPartido := 0;
                  END IF;
                  incrTotal := incrTotal + incrPartido;
                  nPartido := nPartido + 1;
                END LOOP;
        
                UPDATE Club
                SET Num_Socios = Num_Socios + incrTotal
                WHERE CIF = club_cif;
            END;"""

        trigger_compile_error = """
                                CREATE OR REPLACE TRIGGER DispCantidadFinanciacion
                                BEFORE INSERT OR UPDATE
                                ON Financia FOR EACH ROW
                                DECLARE
                                  numJug NUMBER;
                                BEGIN
                                  SELECT COUNT(*) INTO numJug
                                  FROM Jugador
                                  WHERE CIF = :NEW.CIF_C;
        
                                  IF numJug >= 2 THEN
                                    :NEW.Cantidad := :NEW.Cantidad  1.25; -- Missing operator
                                  END IF;
                                END;"""

        for (problem, code) in [(function_problem, funct_compile_error),
                                (proc_problem, proc_compile_error),
                                (trigger_problem, trigger_compile_error)]:
            problem.clean()
            problem.save()
            submit_url = reverse('judge:submit', args=[problem.pk])
            response = client.post(submit_url, {'code': code}, follow=True)
            self.assertEqual(response.json()['veredict'], VeredictCode.WA)
            self.assertIn('error', response.json()['feedback'])
            self.assertIn('compil', response.json()['feedback'])
Esempio n. 14
0
    def test_download_ranking(self):
        """ Test to download excel of results """
        client = Client()
        user = create_user('2222', 'tamara')
        teacher = create_superuser('1111', 'teacher')
        group_a = create_group('1A')
        group_a.user_set.add(user)
        start = first_day_of_course(datetime(2020, 9, 1)).strftime('%Y-%m-%d')
        end = datetime(2021, 3, 7).strftime('%Y-%m-%d')
        collection = create_collection('Coleccion 1')
        select_problem = create_select_problem(collection, 'SelectProblem1')
        select_problem_2 = create_select_problem(collection, 'SelectProblem2')
        sub1 = Submission.objects.create(
            code='SELECT * FROM test where n = 1000',
            user=user,
            verdict_code=VerdictCode.WA,
            problem=select_problem)
        Submission.objects.filter(id=sub1.id).update(
            creation_date=datetime(2021, 3, 1))
        sub2 = Submission.objects.create(
            code='SELECT * FROM test where n = 1000',
            user=user,
            verdict_code=VerdictCode.AC,
            problem=select_problem_2)
        Submission.objects.filter(id=sub2.id).update(
            creation_date=datetime(2021, 3, 2))
        sub3 = Submission.objects.create(
            code='SELECT * FROM test where n = 1000',
            user=user,
            verdict_code=VerdictCode.RE,
            problem=select_problem_2)
        Submission.objects.filter(id=sub3.id).update(
            creation_date=datetime(2021, 3, 4))

        client.login(username=teacher.username, password='******')
        url = reverse('judge:download_ranking', args=[collection.pk])
        response = client.get(url, {
            'group': group_a.id,
            'start': start,
            'end': end
        },
                              follow=True)

        # Teacher download ranking
        self.assertEqual(
            response.get('Content-Disposition'),
            'attachment; filename="ranking.ods"',
        )
        self.assertEqual(response.get('Content-Type'),
                         "application/vnd.oasis.opendocument.spreadsheet")

        cont = response.getvalue()
        buffer = io.BytesIO(cont)
        buffer.seek(0)
        data = get_data(buffer)

        self.assertIn(collection.name_md, data['1A'][0][1])
        self.assertEqual("1A", data['1A'][1][1])
        self.assertEqual(1, data['1A'][6][0])
        self.assertEqual(user.username, data['1A'][6][1])
        self.assertEqual("0/1", data['1A'][6][2])  # SelectProblem1
        self.assertEqual("1/2 (1)", data['1A'][6][3])  # SelectProblem2
        self.assertEqual(1, data['1A'][6][4])  # Score
        self.assertEqual(1, data['1A'][6][5])  # Solved

        # Date or group invalid
        response = client.get(url, {
            'group': group_a.id,
            'start': end,
            'end': start
        },
                              follow=True)
        self.assertIn("La fecha inicial no puede ser mayor que la fecha final",
                      response.content.decode('utf-8'))
        response = client.get(url, {
            'group': group_a.id,
            'start': start,
            'end': datetime(4000, 7, 7).strftime('%Y-%m-%d')
        },
                              follow=True)
        self.assertIn("La fecha final no puede ser mayor que la fecha de hoy",
                      response.content.decode('utf-8'))
        response = client.get(url, {
            'group': group_a.id,
            'start': start,
            'end': ''
        },
                              follow=True)
        self.assertIn("Este campo es obligatorio",
                      response.content.decode('utf-8'))
        response = client.get(url, {
            'group': group_a.id,
            'start': 'eee',
            'end': end
        },
                              follow=True)
        self.assertIn("Introduzca una fecha válida",
                      response.content.decode('utf-8'))
        response = client.get(url, {
            'group': group_a.id,
            'end': end
        },
                              follow=True)
        self.assertIn("Este campo es obligatorio",
                      response.content.decode('utf-8'))
        response = client.get(url, {
            'group': '1A',
            'start': start,
            'end': end
        },
                              follow=True)
        self.assertIn('Introduzca un número entero',
                      response.content.decode('utf-8'))

        # Students cannot download ranking
        client.logout()
        client.login(username=user.username, password='******')
        response = client.get(url, {
            'group': group_a.id,
            'start': start,
            'end': end
        },
                              follow=True)
        self.assertIn('pero no está autorizado a acceder a esta página',
                      response.content.decode('utf-8'))
Esempio n. 15
0
    def test_achievements_submit(self):
        """Test to show correct message when obtain an achievement"""
        client = Client()
        collection = create_collection('Colleccion de prueba XYZ')
        select_problem = create_select_problem(collection,
                                               'SelectProblem ABC DEF')
        user = create_user('5555', 'tamara')
        ach_submission = NumSubmissionsProblemsAchievementDefinition(
            name={"es": 'Un envio'},
            description={"es": 'Envia una solucion para un problema'},
            num_problems=1,
            num_submissions=1)
        ach_submission.save()
        ach_submissions = NumSubmissionsProblemsAchievementDefinition(
            name={"es": 'Tres envios'},
            description={"es": 'Envia tres soluciones de un problema'},
            num_problems=1,
            num_submissions=3)
        ach_submissions.save()
        ach_type = NumSolvedTypeAchievementDefinition(
            name={"es": 'Es select'},
            description={"es": 'Resuelve un problema SELECT'},
            num_problems=1,
            problem_type=ProblemType.SELECT.name)
        client.login(username='******', password='******')
        submit_select_url = reverse('judge:submit', args=[select_problem.pk])

        # The user submits one solution and obtains the first achievement
        response = client.post(submit_select_url, {'code': 'MAL'},
                               follow=True)  # Validation Error, too short
        obtained_achieve = ObtainedAchievement.objects.filter(user=user)
        self.assertIn(obtained_achieve[0].achievement_definition.name['es'],
                      response.json()['achievements'])

        # The user submits a new solution and does not receive any achievement
        response = client.post(submit_select_url, {'code': 'MAL'},
                               follow=True)  # Validation Error, too short
        self.assertNotIn('achievements', response.json())

        # The user makes another submission and obtain two achievements
        ach_type.save()
        curr_path = os.path.dirname(__file__)
        zip_select_path = os.path.join(curr_path, ParseTest.ZIP_FOLDER,
                                       ParseTest.SELECT_OK)
        collection = create_collection('Coleccion 1')
        select = SelectProblem(zipfile=zip_select_path, collection=collection)
        select.clean()
        select.save()
        submit_url = reverse('judge:submit', args=[select.pk])
        response = client.post(submit_url, {'code': select.solution},
                               follow=True)
        obtained_achieve = ObtainedAchievement.objects.filter(user=user)
        self.assertIn(obtained_achieve[1].achievement_definition.name['es'],
                      response.json()['achievements'])
        self.assertIn(obtained_achieve[2].achievement_definition.name['es'],
                      response.json()['achievements'])

        # The user submits a new solution and does not receive any achievement
        response = client.post(submit_select_url, {'code': 'MAL'},
                               follow=True)  # Validation Error, too short
        self.assertNotIn('achievements', response.json())