Skip to content

Commit

Permalink
Added tox.ini, updated for testing
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeff Ober committed Nov 20, 2012
1 parent 5609e89 commit d3231eb
Show file tree
Hide file tree
Showing 10 changed files with 275 additions and 7 deletions.
11 changes: 11 additions & 0 deletions MANIFEST
@@ -0,0 +1,11 @@
LICENSE
MANIFEST.in
README.md
setup.py
adgeletti/__init__.py
adgeletti/models.py
adgeletti/settings.py
adgeletti/static/adgeletti/adgeletti.js
adgeletti/static/adgeletti/adgeletti.min.js
adgeletti/templatetags/__init__.py
adgeletti/templatetags/adgeletti_tags.py
3 changes: 1 addition & 2 deletions adgeletti/models.py
Expand Up @@ -29,9 +29,8 @@ class Meta:
unique_together = ('label', 'site') unique_together = ('label', 'site')


def __unicode__(self): def __unicode__(self):
return _(u'%s (%s)') % (self.label, self.site) return _(u'%s (%s)') % (self.label, self.site.name)


@property
def ad_unit_id(self): def ad_unit_id(self):
return u'%s/%s' % (settings.ADGELETTI_DFP_NETWORK_ID, self.ad_unit) return u'%s/%s' % (settings.ADGELETTI_DFP_NETWORK_ID, self.ad_unit)


Expand Down
4 changes: 2 additions & 2 deletions adgeletti/templatetags/adgeletti_tags.py
Expand Up @@ -151,11 +151,11 @@ def render(self, context):
for pos in positions: for pos in positions:
_position_data = { _position_data = {
'breakpoint': pos.breakpoint, 'breakpoint': pos.breakpoint,
'ad_unit_id': pos.slot.ad_unit_id, 'ad_unit_id': pos.slot.ad_unit_id(),
'sizes': [ 'sizes': [
[size.width, size.height] for size in pos.sizes.all() [size.width, size.height] for size in pos.sizes.all()
], ],
'div_id': context.render_context[ADS][slot][breakpoint], 'div_id': context.render_context[ADS][pos.slot.label][pos.breakpoint],
} }
buf.write(AdBlock.POSITION_TPL % (json.dumps(_position_data),)) buf.write(AdBlock.POSITION_TPL % (json.dumps(_position_data),))


Expand Down
2 changes: 2 additions & 0 deletions adgeletti/tests/__init__.py
@@ -0,0 +1,2 @@
from adgeletti.tests.test_models import *
from adgeletti.tests.test_tags import *
169 changes: 169 additions & 0 deletions adgeletti/tests/settings.py
@@ -0,0 +1,169 @@
# Django settings for adgeletti

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
# ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'database.sqlite3', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = ''

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = ''

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = '9^l52u_q92#pb7(=+*ch(3f#3bkv14xu0g_ud7%rf*kmq33la@'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'adgeletti.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'adgeletti.wsgi.application'

TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'adgeletti',
)

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}

################################################################################
# Adgeletti Configuration
################################################################################

# DoubleClick network ID
ADGELETTI_DFP_NETWORK_ID = '0123456789'

# List of identifiers for breakpoints. This is used to integrate adgeletti into
# a Django site's own responsive framework.
ADGELETTI_BREAKPOINTS = [
'default',
'tablet',
'wide',
'mobile',
]

30 changes: 30 additions & 0 deletions adgeletti/tests/test_models.py
@@ -0,0 +1,30 @@
import mock
from django.utils.unittest import TestCase
from django.conf import settings
from adgeletti.models import Size, AdSlot


class SizeTestCase(TestCase):
def setUp(self):
self.size = mock.Mock(spec=Size, width=200, height=100)

def test_stringify(self):
string = Size.__unicode__(self.size)
self.assertEqual(string, '200px x 100px')


class AdSlotTestCase(TestCase):
def setUp(self):
site = mock.Mock()
site.name = 'Test site'
self.slot = mock.Mock(spec=AdSlot, label='LABEL', site=site, ad_unit='UNIT_ID')

def test_stringify(self):
string = AdSlot.__unicode__(self.slot)
self.assertEqual(string, 'LABEL (Test site)')

def test_ad_unit_id(self):
string = AdSlot.ad_unit_id(self.slot)
expected = '%s/%s' % (settings.ADGELETTI_DFP_NETWORK_ID, 'UNIT_ID')
self.assertEqual(string, expected)

36 changes: 36 additions & 0 deletions adgeletti/tests/test_tags.py
@@ -0,0 +1,36 @@
import mock
from django import template
from django.utils.unittest import TestCase
from adgeletti.templatetags import adgeletti_tags as tags

class TemplateTestCase(TestCase):
def render(self, template_string, **kwargs):
t = template.Template(template_string)
c = template.Context(kwargs)
return t.render(c)


class ErrorTestCase(TestCase):
@mock.patch('adgeletti.templatetags.adgeletti_tags.escape')
def test_error_strings(self, escape):
escape.return_value = 'BAR'
error = tags.error('FOO')
escape.assert_called_with('FOO')
self.assertEqual(error, '<!-- BAR -->\n')


class ParseAdTestCase(TemplateTestCase):
def test_parse_ad(self):
token = mock.Mock()
token.split_contents = mock.Mock(return_value=['ad', 'SLOT', 'BREAKPOINT'])
node = tags.parse_ad(None, token)
self.assertEqual(node.slot, 'SLOT')
self.assertListEqual(node.breakpoints, ['BREAKPOINT'])

def test_parse_ad_bad_args(self):
token = mock.Mock()
token.split_contents = mock.Mock(return_value=['ad', 'SLOT'])
with self.assertRaises(template.TemplateSyntaxError) as exc:
tags.parse_ad(None, token)
self.assertEqual(exc.exception.message, u'usage: {% ad SLOT BREAKPOINT [BREAKPOINT ...] %}')

9 changes: 9 additions & 0 deletions adgeletti/tests/urls.py
@@ -0,0 +1,9 @@
""" A django URL specification for use during unit testing.
"""

from django.conf.urls import patterns, include
from django.contrib import admin

urlpatterns = patterns('',
(r'^admin/', include(admin.site.urls)),
)
6 changes: 3 additions & 3 deletions setup.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
from distutils.core import setup #from distutils.core import setup
from setuptools import setup, find_packages




# Dynamically calculate the version based on adgeletti.VERSION # Dynamically calculate the version based on adgeletti.VERSION
Expand All @@ -13,8 +14,6 @@
version = version, version = version,
author = 'Jeff.Ober and Michael.Angeletti @ CMG Digital [dot] com', author = 'Jeff.Ober and Michael.Angeletti @ CMG Digital [dot] com',
url = 'http://github.com/orokusaki/adgeletti/', url = 'http://github.com/orokusaki/adgeletti/',
packages=['adgeletti'],
package_data={'adgeletti': ['static/adgeletti/*', 'templatetags/*.py']},
classifiers = [ classifiers = [
'Environment :: Web Environment', 'Environment :: Web Environment',
'Framework :: Django', 'Framework :: Django',
Expand All @@ -24,4 +23,5 @@
'Programming Language :: Python', 'Programming Language :: Python',
'Topic :: Utilities' 'Topic :: Utilities'
], ],
packages=find_packages(),
) )
12 changes: 12 additions & 0 deletions tox.ini
@@ -0,0 +1,12 @@
[tox]
envlist = py26

[testenv]
deps =
django
mock
setenv =
DJANGO_SETTINGS_MODULE=adgeletti.tests.settings
commands =
{envbindir}/django-admin.py syncdb --noinput
{envbindir}/django-admin.py test adgeletti

0 comments on commit d3231eb

Please sign in to comment.