from django.test import TestCase from django.test.client import Client from django.core.handlers.wsgi import WSGIRequest from django.core.urlresolvers import reverse from adzone.models import * from django.contrib.auth.models import User def datenow(): from datetime import datetime return datetime.now() class RequestFactory(Client): """ Class that lets you create mock Request objects for use in testing. Usage: rf = RequestFactory() get_request = rf.get('/hello/') post_request = rf.post('/submit/', {'foo': 'bar'}) This class re-uses the django.test.client.Client interface, docs here: http://www.djangoproject.com/documentation/testing/#the-test-client Once you have a request object you can pass it to any view function, just as if that view had been hooked up using a URLconf. """ def request(self, **request): """ Similar to parent class, but returns the request object as soon as it has created it. """ environ = { "HTTP_COOKIE": self.cookies, "PATH_INFO": "/", "QUERY_STRING": "", "REQUEST_METHOD": "GET", "SCRIPT_NAME": "", "SERVER_NAME": "testserver", "SERVER_PORT": 80, "SERVER_PROTOCOL": "HTTP/1.1", "REMOTE_ADDR": "127.0.0.1", } environ.update(self.defaults) environ.update(request) return WSGIRequest(environ) class AdvertisingTestCase(TestCase): def setUp(self): self.request = RequestFactory().request() self.user = User.objects.create_user("test", "test@example.com", "testpass") self.advertiser = Advertiser.objects.create( company_name="teh_node Web Development", website="http://andre.smoenux.webfactional.com/", user=self.user, ) # Categories setup self.category = AdCategory.objects.create( title="Internet Services", slug="internet-services", description="All internet based services", ) self.category2 = AdCategory.objects.create( title="Category Two", slug="categorytwo", description="A Second Category" ) # Zones setup self.adzone = AdZone.objects.create( title="Sidebar", slug="sidebar", description="Side Bar Ads" ) self.adzone2 = AdZone.objects.create( title="Content Banner", slug="contentbanner", description="Content Adverts" ) # Ad setup self.ad = TextAd.objects.create( title="First Ad", content="For all your web design and development needs, at competitive rates.", url="http://www.teh-node.co.za/", enabled=True, advertiser=self.advertiser, category=self.category, zone=self.adzone, ) self.ad2 = TextAd.objects.create( title="Second Ad", content="A second advert.", url="http://www.teh-node.co.za/", enabled=True, advertiser=self.advertiser, category=self.category2, zone=self.adzone2, ) self.ad3 = TextAd.objects.create( title="A Third Ad", content="A third advert.", url="http://www.teh-node.co.za/", enabled=True, advertiser=self.advertiser, category=self.category2, zone=self.adzone2, ) # AdImpression Setup self.impression1 = AdImpression.objects.create( impression_date=datenow(), source_ip="127.0.0.2", ad=self.ad ) self.impression2 = AdImpression.objects.create( impression_date=datenow(), source_ip="127.0.0.3", ad=self.ad2 ) # Clicks Setup self.adclick1 = AdClick.objects.create( click_date=datenow(), source_ip="127.0.0.1", ad=self.ad ) class AdvertiserTestCase(AdvertisingTestCase): def testAdvertiser(self): self.assertEquals( self.advertiser.get_website_url(), "http://andre.smoenux.webfactional.com/" ) class CategoryTestCase(AdvertisingTestCase): def testAdCategory(self): self.assertEquals(self.category.__unicode__(), "Internet Services") class ZoneTestCase(AdvertisingTestCase): def testAdZone(self): self.assertEquals(self.adzone.__unicode__(), "Sidebar") def testAdinZone(self): ads = TextAd.objects.filter(zone__slug="sidebar") self.assertEquals(len(ads), 1) class AdvertTestCase(AdvertisingTestCase): def testAd(self): self.assertEquals(reverse("adzone_ad_view", args=["1"])[-8:], "/view/1/") adimpressions = AdImpression.objects.filter(ad=self.ad) self.assertEquals(len(adimpressions), 1) self.assertEquals(adimpressions[0].source_ip, "127.0.0.2") def testAdAdvertiser(self): self.assertEquals(self.ad.advertiser.__unicode__(), "teh_node Web Development") self.assertEquals(self.ad.advertiser.company_name, "teh_node Web Development") def testAddsInCategory(self): ads = TextAd.objects.filter(category__slug="internet-services") self.assertEquals(len(ads), 1) self.assertEquals(ads[0].title, "First Ad") def testRandomAd(self): ad = AdBase.objects.get_random_ad( ad_category="internet-services", ad_zone="sidebar" ) self.assertEquals(ad.title, "First Ad") class ImpressionTestCase(AdvertisingTestCase): def testImpression(self): impressions = AdImpression.objects.all() self.assertEquals(len(impressions), 2) class ClickTestCase(AdvertisingTestCase): def testClicks(self): clicks = AdClick.objects.all() self.assertEquals(len(clicks), 1) def testClickOnAds(self): c = Client(REMOTE_ADDR="127.0.0.1") response = c.get(reverse("adzone_ad_view", args=["1"])) self.assertEquals(len(AdClick.objects.all()), 2) click = AdClick.objects.all()[1] self.assertEquals(click.source_ip, "127.0.0.1") def testInvalidAdURL(self): c = Client(REMOTE_ADDR="127.0.0.1") response = c.get("/te/10") self.assertEquals(len(AdClick.objects.all()), 1)