add test
Signed-off-by: Hiroshi Miura <miurahr@linux.com>
This commit is contained in:
		
							parent
							
								
									fbf356b335
								
							
						
					
					
						commit
						999c458c1b
					
				
					 1 changed files with 307 additions and 0 deletions
				
			
		
							
								
								
									
										307
									
								
								symposion/sponsorship/tests.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								symposion/sponsorship/tests.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,307 @@ | |||
| from cStringIO import StringIO | ||||
| import os | ||||
| import shutil | ||||
| import tempfile | ||||
| from zipfile import ZipFile | ||||
| 
 | ||||
| from django.conf import settings | ||||
| from django.contrib.auth.models import User | ||||
| from django.core.exceptions import ValidationError | ||||
| from django.core.urlresolvers import reverse | ||||
| from django.test import TestCase | ||||
| from django.test.utils import override_settings | ||||
| 
 | ||||
| from pycon.sponsorship.models import Benefit, Sponsor, SponsorBenefit,\ | ||||
|     SponsorLevel | ||||
| from symposion.conference.models import current_conference | ||||
| 
 | ||||
| 
 | ||||
| class TestSponsorZipDownload(TestCase): | ||||
|     def setUp(self): | ||||
|         self.user = User.objects.create_user(username='joe', | ||||
|                                              email='joe@example.com', | ||||
|                                              password='joe') | ||||
|         self.user.is_staff = True | ||||
|         self.user.save() | ||||
|         self.url = reverse("sponsor_zip_logos") | ||||
|         self.assertTrue(self.client.login(username='joe@example.com', | ||||
|                                           password='joe')) | ||||
| 
 | ||||
|         # we need a sponsor | ||||
|         conference = current_conference() | ||||
|         self.sponsor_level = SponsorLevel.objects.create( | ||||
|             conference=conference, name="Lead", cost=1) | ||||
|         self.sponsor = Sponsor.objects.create( | ||||
|             name="Big Daddy", | ||||
|             level=self.sponsor_level, | ||||
|             active=True, | ||||
|         ) | ||||
| 
 | ||||
|         # Create our benefits, of various types | ||||
|         self.text_benefit = Benefit.objects.create(name="text", type="text") | ||||
|         self.file_benefit = Benefit.objects.create(name="file", type="file") | ||||
|         # These names must be spelled exactly this way: | ||||
|         self.weblogo_benefit = Benefit.objects.create(name="Web logo", type="weblogo") | ||||
|         self.printlogo_benefit = Benefit.objects.create(name="Print logo", type="file") | ||||
|         self.advertisement_benefit = Benefit.objects.create(name="Advertisement", type="file") | ||||
| 
 | ||||
|     def validate_response(self, rsp, names_and_sizes): | ||||
|         # Ensure a response from the view looks right, contains a valid | ||||
|         # zip archive, has files with the right names and sizes. | ||||
|         self.assertEqual("application/zip", rsp['Content-type']) | ||||
|         prefix = settings.CONFERENCE_URL_PREFIXES[settings.CONFERENCE_ID] | ||||
| 
 | ||||
|         self.assertEqual( | ||||
|             'attachment; filename="pycon_%s_sponsorlogos.zip"' % prefix, | ||||
|             rsp['Content-Disposition']) | ||||
|         zipfile = ZipFile(StringIO(rsp.content), "r") | ||||
|         # Check out the zip - testzip() returns None if no errors found | ||||
|         self.assertIsNone(zipfile.testzip()) | ||||
|         # Compare contents to what is expected | ||||
|         infolist = zipfile.infolist() | ||||
|         self.assertEqual(len(names_and_sizes), len(infolist)) | ||||
|         for info, name_and_size in zip(infolist, names_and_sizes): | ||||
|             name, size = name_and_size | ||||
|             self.assertEqual(name, info.filename) | ||||
|             self.assertEqual(size, info.file_size) | ||||
| 
 | ||||
|     def make_temp_file(self, name, size=0): | ||||
|         # Create a temp file with the given name and size under self.temp_dir | ||||
|         path = os.path.join(self.temp_dir, name) | ||||
|         with open(path, "wb") as f: | ||||
|             f.write(size * "x") | ||||
| 
 | ||||
|     def test_must_be_logged_in(self): | ||||
|         # Must be logged in to use the view | ||||
|         # If not logged in, doesn't redirect, just serves up a login view | ||||
|         self.client.logout() | ||||
|         rsp = self.client.get(self.url) | ||||
|         self.assertEqual(200, rsp.status_code) | ||||
|         self.assertIn("""<body class="login">""", rsp.content) | ||||
| 
 | ||||
|     def test_must_be_staff(self): | ||||
|         # Only staff can use the view | ||||
|         # If not staff, doesn't show error, just serves up a login view | ||||
|         # Also, the dashboard doesn't show the download button | ||||
|         self.user.is_staff = False | ||||
|         self.user.save() | ||||
|         rsp = self.client.get(self.url) | ||||
|         self.assertEqual(200, rsp.status_code) | ||||
|         self.assertIn("""<body class="login">""", rsp.content) | ||||
|         rsp = self.client.get(reverse('dashboard')) | ||||
|         self.assertNotIn(self.url, rsp.content) | ||||
| 
 | ||||
|     def test_no_files(self): | ||||
|         # If there are no sponsor files, we still work | ||||
|         # And the dashboard shows our download button | ||||
|         rsp = self.client.get(self.url) | ||||
|         self.validate_response(rsp, []) | ||||
|         rsp = self.client.get(reverse('dashboard')) | ||||
|         self.assertIn(self.url, rsp.content) | ||||
| 
 | ||||
|     def test_different_benefit_types(self): | ||||
|         # We only get files from the benefits named "Print logo" and "Web logo" | ||||
|         # And we ignore any non-existent files | ||||
|         try: | ||||
|             # Create a temp dir for media files | ||||
|             self.temp_dir = tempfile.mkdtemp() | ||||
|             with override_settings(MEDIA_ROOT=self.temp_dir): | ||||
| 
 | ||||
|                 # Give our sponsor some benefits | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.text_benefit, | ||||
|                     text="Foo!" | ||||
|                 ) | ||||
| 
 | ||||
|                 self.make_temp_file("file1", 10) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.file_benefit, | ||||
|                     upload="file1" | ||||
|                 ) | ||||
| 
 | ||||
|                 self.make_temp_file("file2", 20) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.weblogo_benefit, | ||||
|                     upload="file2" | ||||
|                 ) | ||||
| 
 | ||||
|                 # Benefit whose file is missing from the disk | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.weblogo_benefit, | ||||
|                     upload="file3" | ||||
|                 ) | ||||
| 
 | ||||
|                 # print logo benefit | ||||
|                 self.make_temp_file("file4", 40) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.printlogo_benefit, | ||||
|                     upload="file4" | ||||
|                 ) | ||||
| 
 | ||||
|                 self.make_temp_file("file5", 50) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.advertisement_benefit, | ||||
|                     upload="file5" | ||||
|                 ) | ||||
| 
 | ||||
|                 rsp = self.client.get(self.url) | ||||
|                 expected = [ | ||||
|                     ('web_logos/lead/big_daddy/file2', 20), | ||||
|                     ('print_logos/lead/big_daddy/file4', 40), | ||||
|                     ('advertisement/lead/big_daddy/file5', 50) | ||||
|                 ] | ||||
|                 self.validate_response(rsp, expected) | ||||
|         finally: | ||||
|             if hasattr(self, 'temp_dir'): | ||||
|                 # Clean up any temp media files | ||||
|                 shutil.rmtree(self.temp_dir) | ||||
| 
 | ||||
|     def test_file_org(self): | ||||
|         # The zip file is organized into directories: | ||||
|         #  {print_logos,web_logos,advertisement}/<sponsor_level>/<sponsor_name>/<filename> | ||||
| 
 | ||||
|         # Add another sponsor at a different sponsor level | ||||
|         conference = current_conference() | ||||
|         self.sponsor_level2 = SponsorLevel.objects.create( | ||||
|             conference=conference, name="Silly putty", cost=1) | ||||
|         self.sponsor2 = Sponsor.objects.create( | ||||
|             name="Big Mama", | ||||
|             level=self.sponsor_level2, | ||||
|             active=True, | ||||
|         ) | ||||
|         # | ||||
|         try: | ||||
|             # Create a temp dir for media files | ||||
|             self.temp_dir = tempfile.mkdtemp() | ||||
|             with override_settings(MEDIA_ROOT=self.temp_dir): | ||||
| 
 | ||||
|                 # Give our sponsors some benefits | ||||
|                 self.make_temp_file("file1", 10) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.weblogo_benefit, | ||||
|                     upload="file1" | ||||
|                 ) | ||||
|                 # print logo benefit | ||||
|                 self.make_temp_file("file2", 20) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor, | ||||
|                     benefit=self.printlogo_benefit, | ||||
|                     upload="file2" | ||||
|                 ) | ||||
|                 # Sponsor 2 | ||||
|                 self.make_temp_file("file3", 30) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor2, | ||||
|                     benefit=self.weblogo_benefit, | ||||
|                     upload="file3" | ||||
|                 ) | ||||
|                 # print logo benefit | ||||
|                 self.make_temp_file("file4", 42) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor2, | ||||
|                     benefit=self.printlogo_benefit, | ||||
|                     upload="file4" | ||||
|                 ) | ||||
|                 # ad benefit | ||||
|                 self.make_temp_file("file5", 55) | ||||
|                 SponsorBenefit.objects.create( | ||||
|                     sponsor=self.sponsor2, | ||||
|                     benefit=self.advertisement_benefit, | ||||
|                     upload="file5" | ||||
|                 ) | ||||
| 
 | ||||
|                 rsp = self.client.get(self.url) | ||||
|                 expected = [ | ||||
|                     ('web_logos/lead/big_daddy/file1', 10), | ||||
|                     ('web_logos/silly_putty/big_mama/file3', 30), | ||||
|                     ('print_logos/lead/big_daddy/file2', 20), | ||||
|                     ('print_logos/silly_putty/big_mama/file4', 42), | ||||
|                     ('advertisement/silly_putty/big_mama/file5', 55), | ||||
|                 ] | ||||
|                 self.validate_response(rsp, expected) | ||||
|         finally: | ||||
|             if hasattr(self, 'temp_dir'): | ||||
|                 # Clean up any temp media files | ||||
|                 shutil.rmtree(self.temp_dir) | ||||
| 
 | ||||
| 
 | ||||
| class TestBenefitValidation(TestCase): | ||||
|     """ | ||||
|     It should not be possible to save a SponsorBenefit if it has the | ||||
|     wrong kind of data in it - e.g. a text-type benefit cannot have | ||||
|     an uploaded file, and vice-versa. | ||||
|     """ | ||||
|     def setUp(self): | ||||
|         # we need a sponsor | ||||
|         conference = current_conference() | ||||
|         self.sponsor_level = SponsorLevel.objects.create( | ||||
|             conference=conference, name="Lead", cost=1) | ||||
|         self.sponsor = Sponsor.objects.create( | ||||
|             name="Big Daddy", | ||||
|             level=self.sponsor_level, | ||||
|         ) | ||||
| 
 | ||||
|         # Create our benefit types | ||||
|         self.text_type = Benefit.objects.create(name="text", type="text") | ||||
|         self.file_type = Benefit.objects.create(name="file", type="file") | ||||
|         self.weblogo_type = Benefit.objects.create(name="log", type="weblogo") | ||||
|         self.simple_type = Benefit.objects.create(name="simple", type="simple") | ||||
| 
 | ||||
|     def validate(self, should_work, benefit_type, upload, text): | ||||
|         obj = SponsorBenefit( | ||||
|             benefit=benefit_type, | ||||
|             sponsor=self.sponsor, | ||||
|             upload=upload, | ||||
|             text=text | ||||
|         ) | ||||
|         if should_work: | ||||
|             obj.save() | ||||
|         else: | ||||
|             with self.assertRaises(ValidationError): | ||||
|                 obj.save() | ||||
| 
 | ||||
|     def test_text_has_text(self): | ||||
|         self.validate(True, self.text_type, upload=None, text="Some text") | ||||
| 
 | ||||
|     def test_text_has_upload(self): | ||||
|         self.validate(False, self.text_type, upload="filename", text='') | ||||
| 
 | ||||
|     def test_text_has_both(self): | ||||
|         self.validate(False, self.text_type, upload="filename", text="Text") | ||||
| 
 | ||||
|     def test_file_has_text(self): | ||||
|         self.validate(False, self.file_type, upload=None, text="Some text") | ||||
| 
 | ||||
|     def test_file_has_upload(self): | ||||
|         self.validate(True, self.file_type, upload="filename", text='') | ||||
| 
 | ||||
|     def test_file_has_both(self): | ||||
|         self.validate(False, self.file_type, upload="filename", text="Text") | ||||
| 
 | ||||
|     def test_weblogo_has_text(self): | ||||
|         self.validate(False, self.weblogo_type, upload=None, text="Some text") | ||||
| 
 | ||||
|     def test_weblogo_has_upload(self): | ||||
|         self.validate(True, self.weblogo_type, upload="filename", text='') | ||||
| 
 | ||||
|     def test_weblogo_has_both(self): | ||||
|         self.validate(False, self.weblogo_type, upload="filename", text="Text") | ||||
| 
 | ||||
|     def test_simple_has_neither(self): | ||||
|         self.validate(True, self.simple_type, upload=None, text='') | ||||
| 
 | ||||
|     def test_simple_has_text(self): | ||||
|         self.validate(True, self.simple_type, upload=None, text="Some text") | ||||
| 
 | ||||
|     def test_simple_has_upload(self): | ||||
|         self.validate(False, self.simple_type, upload="filename", text='') | ||||
| 
 | ||||
|     def test_simple_has_both(self): | ||||
|         self.validate(False, self.simple_type, upload="filename", text="Text") | ||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Hiroshi Miura
						Hiroshi Miura