@@ -3213,6 +3213,7 @@ class TestReattachingProblems(TestCase):
32133213 'test_extra_problem' ,
32143214 'test_permissions' ,
32153215 'test_problem_site' ,
3216+ 'test_problem_with_long_id'
32163217 ]
32173218
32183219 def test_reattaching_problem (self ):
@@ -3237,10 +3238,12 @@ def test_reattaching_problem(self):
32373238 self .assertContains (response , u'Sum\u017c yce' )
32383239 self .assertContains (response , "Attach" )
32393240
3241+ prev_problem_count = ProblemInstance .objects .count ()
3242+
32403243 response = self .client .post (url , data = {'submit' : True }, follow = True )
32413244 self .assertEqual (response .status_code , 200 )
32423245 self .assertContains (response , 'c2' )
3243- self .assertEqual (ProblemInstance .objects .count (), 3 )
3246+ self .assertEqual (ProblemInstance .objects .count (), prev_problem_count + 1 )
32443247 self .assertContains (response , ' added successfully.' )
32453248 self .assertContains (response , u'Sum\u017c yce' )
32463249 self .assertTrue (ProblemInstance .objects .filter (contest__id = 'c2' ).exists ())
@@ -3279,10 +3282,12 @@ def test_reattaching_problems(self):
32793282 self .assertContains (response , u'Sum\u017c yce' )
32803283 self .assertContains (response , "Attach" )
32813284
3285+ prev_problem_count = ProblemInstance .objects .count ()
3286+
32823287 response = self .client .post (url , data = {'submit' : True }, follow = True )
32833288 self .assertEqual (response .status_code , 200 )
32843289 self .assertContains (response , 'c2' )
3285- self .assertEqual (ProblemInstance .objects .count (), 4 )
3290+ self .assertEqual (ProblemInstance .objects .count (), prev_problem_count + 2 )
32863291 self .assertContains (response , ' added successfully.' )
32873292 self .assertContains (response , u'Sum\u017c yce' )
32883293 self .assertTrue (ProblemInstance .objects .filter (contest__id = 'c2' ).exists ())
@@ -3312,6 +3317,37 @@ def test_permissions(self):
33123317 response = self .client .get (url )
33133318 self .assertEqual (response .status_code , 403 )
33143319
3320+ # Makes sure that ids are correctly forwarded in links from
3321+ # reattach_problem_contest_list to reattach_problem_confirm.
3322+ def test_correctly_passing_problem_ids (self ):
3323+ self .assertTrue (self .client .login (username = 'test_admin' ))
3324+ pi_id1 = ProblemInstance .objects .get (id = 1 ).id
3325+ pi_id2 = ProblemInstance .objects .get (id = 12345 ).id
3326+
3327+ self .client .get ('/c/c/' ) # 'c' becomes the current contest
3328+
3329+ url = reverse ('reattach_problem_contest_list' ) + "?ids={}" .format (pi_id1 )
3330+ response = self .client .get (url , follow = True )
3331+ self .assertEqual (response .status_code , 200 )
3332+ self .assertContains (response , "c/c/reattach/c/confirm/?ids=1" )
3333+
3334+ url = reverse ('reattach_problem_contest_list' ) + "?ids={}" .format (pi_id2 )
3335+ response = self .client .get (url , follow = True )
3336+ self .assertEqual (response .status_code , 200 )
3337+ self .assertContains (response , "c/c/reattach/c/confirm/?ids=12345" )
3338+
3339+ url = reverse ('reattach_problem_contest_list' ) + "?ids={},{}" .format (pi_id1 , pi_id2 )
3340+ response = self .client .get (url , follow = True )
3341+ self .assertEqual (response .status_code , 200 )
3342+ self .assertContains (response , "c/c/reattach/c/confirm/?ids=1%2C12345" )
3343+
3344+ url = reverse ('reattach_problem_contest_list' ) + "?ids={},{}" .format (pi_id2 , pi_id1 )
3345+ response = self .client .get (url , follow = True )
3346+ self .assertEqual (response .status_code , 200 )
3347+ self .assertContains (response , "c/c/reattach/c/confirm/?ids=12345%2C1" )
3348+
3349+
3350+
33153351# Testing whether a user with admin permission for one contest
33163352# can manage problems belonging to another contest using
33173353# the problem manager interface.
@@ -3332,6 +3368,7 @@ def test_managing(self):
33323368 reverse ('reattach_problem_contest_list' ) + "?ids={}" .format (problem_id ),
33333369 reverse ('reattach_problem_confirm' , args = ('available_contest' ,)) + "?ids={}" .format (problem_id ),
33343370 reverse ('assign_problems_to_a_round' ) + "?ids={}" .format (problem_id ),
3371+ reverse ('delete_problems' ) + "?ids={}" .format (problem_id ),
33353372 ]
33363373
33373374 for url in get_urls :
@@ -3341,6 +3378,7 @@ def test_managing(self):
33413378 post_urls_and_data = [
33423379 (reverse ('reattach_problem_confirm' , args = ('available_contest' ,)) + "?ids={}" .format (problem_id ), {}),
33433380 (reverse ('assign_problems_to_a_round' ) + "?ids={}" .format (problem_id ), {'round' : 100 }),
3381+ (reverse ('delete_problems' ) + "?ids={}" .format (problem_id ), {}),
33443382 ]
33453383
33463384 for url , data in post_urls_and_data :
@@ -3554,6 +3592,82 @@ def test_permissions(self):
35543592 Contest .objects .get (id = 'one-round' ).id
35553593 )
35563594
3595+ class TestDeletingProblems (TestCase ):
3596+ fixtures = [
3597+ 'test_users' ,
3598+ 'test_contest' ,
3599+ 'test_full_package' ,
3600+ 'test_problem_instance' ,
3601+ 'test_extra_problem' ,
3602+ 'test_permissions' ,
3603+ 'test_problem_site' ,
3604+ 'test_extra_contests' ,
3605+ 'test_problem_instance_with_and_without_contests' ,
3606+ ]
3607+
3608+ def test_deleting_problem (self ):
3609+ pi_id = ProblemInstance .objects .get (id = 1 ).id
3610+
3611+ self .assertTrue (self .client .login (username = 'test_admin' ))
3612+ self .client .get ('/c/c/' ) # 'c' becomes the current contest
3613+
3614+ url = reverse ('delete_problems' ) + "?ids={}" .format (pi_id )
3615+ response = self .client .get (url , follow = True )
3616+
3617+ self .assertEqual (response .status_code , 200 )
3618+ self .assertContains (response , "Are you sure you want to delete the selected problems?" )
3619+ self .assertContains (response , ProblemInstance .objects .get (id = pi_id ).problem .name )
3620+
3621+ response = self .client .post (url , data = {}, follow = True )
3622+ self .assertEqual (response .status_code , 200 )
3623+ self .assertContains (response , "Problems deleted successfully" )
3624+ self .assertFalse (ProblemInstance .objects .filter (id = pi_id ).exists ())
3625+
3626+ def test_deleting_problems (self ):
3627+ pi_id1 = ProblemInstance .objects .get (id = 1 ).id
3628+ pi_id2 = ProblemInstance .objects .get (id = 2 ).id
3629+
3630+ self .assertTrue (self .client .login (username = 'test_admin' ))
3631+ self .client .get ('/c/c/' ) # 'c' becomes the current contest
3632+
3633+ url = reverse ('delete_problems' ) + "?ids={}%2C{}" .format (pi_id1 , pi_id2 )
3634+ response = self .client .get (url , follow = True )
3635+
3636+ self .assertEqual (response .status_code , 200 )
3637+ self .assertContains (response , "Are you sure you want to delete the selected problems?" )
3638+ self .assertContains (response , ProblemInstance .objects .get (id = pi_id1 ).problem .name )
3639+ self .assertContains (response , ProblemInstance .objects .get (id = pi_id2 ).problem .name )
3640+
3641+ response = self .client .post (url , data = {}, follow = True )
3642+ self .assertEqual (response .status_code , 200 )
3643+ self .assertContains (response , "Problems deleted successfully" )
3644+ self .assertFalse (ProblemInstance .objects .filter (id = pi_id1 ).exists ())
3645+ self .assertFalse (ProblemInstance .objects .filter (id = pi_id2 ).exists ())
3646+
3647+ def test_bad_problem_ids (self ):
3648+ self .assertTrue (self .client .login (username = 'test_admin' ))
3649+
3650+ self .client .get ('/c/c/' ) # 'c' becomes the current contest
3651+
3652+ # Non-existent problem id
3653+ url = reverse ('assign_problems_to_a_round' ) + "?ids={}" .format (30 )
3654+ response = self .client .get (url , follow = True )
3655+ self .assertEqual (response .status_code , 400 )
3656+
3657+ # Non-numeric problem id
3658+ url = reverse ('assign_problems_to_a_round' ) + "?ids=A,30"
3659+ response = self .client .get (url , follow = True )
3660+ self .assertEqual (response .status_code , 400 )
3661+
3662+ # ProblemInstance which belongs to another contest
3663+ url = reverse ('assign_problems_to_a_round' ) + "?ids={}" .format (10 )
3664+ response = self .client .get (url , follow = True )
3665+ self .assertEqual (response .status_code , 400 )
3666+
3667+ # ProblemInstance which does not belong to any contest
3668+ url = reverse ('assign_problems_to_a_round' ) + "?ids={}" .format (20 )
3669+ response = self .client .get (url , follow = True )
3670+ self .assertEqual (response .status_code , 400 )
35573671
35583672class TestModifyContest (TestCase ):
35593673 fixtures = ['test_users' ]
0 commit comments