telemeta.tests.test_models module
# -*- coding: utf-8 -*- # Copyright (C) 2007-2010 Samalyse SARL # Copyright (C) 2010-2017 Parisson SARL # This file is part of Telemeta. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # Authors: Olivier Guilyardi <olivier@samalyse.com> # David LIPSZYC <davidlipszyc@gmail.com> # Thomas Fillon <thomas@parisson.com> from django.contrib.auth.models import User from django.test import TestCase from telemeta.models import LocationType, Location, EthnicGroup from telemeta.models.enum import Publisher, PublisherCollection from telemeta.models.enum import LegalRight from telemeta.models import MediaCollection, MediaItem from telemeta.models.fields import RequiredFieldError from datetime import datetime, timedelta import pytest class CollectionItemTestCase(TestCase): def setUp(self): "Create a test database based on objects created in Django" self.user_david = User.objects.create_user(username="david") self.user_olivier = User.objects.create_user(username="olivier") self.country = LocationType.objects.create(code="country", name="Country") self.continent = LocationType.objects.create(code="continent", name="Continent") self.city = LocationType.objects.create(code="city", name="City") self.paris = Location.objects.create(name="Paris", type=Location.OTHER_TYPE, complete_type=self.city) self.france = Location.objects.create(name="France", type=Location.COUNTRY, complete_type=self.country) self.europe = Location.objects.create(name="Europe", type=Location.CONTINENT, complete_type=self.continent) self.belgique = Location.objects.create(name="Belgique", type=Location.COUNTRY, complete_type=self.country) self.europe.add_child(self.france) self.france.add_child(self.paris) self.europe.add_child(self.belgique) self.a = EthnicGroup.objects.create(value="a") self.b = EthnicGroup.objects.create(value="b") self.c = EthnicGroup.objects.create(value="c") self.d = EthnicGroup.objects.create(value="d") self.collection_persepolis = MediaCollection(id=1, code="CNRSMH_E_1970_001_002", reference="A1", title="Persepolis", creator="Abraham LINCOLN", collector="Friedrich HEINZ", year_published=2009, is_published=True, recorded_from_year=1970, recorded_to_year=1980) self.collection_persepolis.set_revision(self.user_david) self.collection_persepolis.save() self.collection_volonte = MediaCollection(id=2, reference="A2", code="CNRSMH_I_1960_001", title="Volonté de puissance", creator="Friedrich NIETZSCHE", collector="Jean AMORA", year_published=1999, recorded_from_year=1960, recorded_to_year=2000) self.collection_volonte.set_revision(self.user_olivier) self.collection_volonte.save() self.collection_nicolas = MediaCollection(id=3, reference="A3", code="CNRSMH_I_1967_123", title="Petit nicolas", creator="Georgette McKenic", collector="Paul MAILLE", year_published=1999, recorded_from_year=1967, recorded_to_year=1968) self.collection_nicolas.set_revision(self.user_olivier) self.collection_nicolas.save() self.item_1 = MediaItem(id=1, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_44", recorded_from_date="1971-01-12", recorded_to_date="1971-02-24", location=self.paris, ethnic_group=self.a, title="item 1", author="Mickael SHEPHERD", collector="Charles PREMIER", comment="comment 1") self.item_1.set_revision(self.user_david) self.item_2 = MediaItem(id=2, collection=self.collection_volonte, code="CNRSMH_I_1960_001_129", recorded_from_date="1981-01-12", recorded_to_date="1991-02-24", location=self.france, ethnic_group=self.a, title="item 2", author="Rick ROLL", comment="comment 2") self.item_2.set_revision(self.user_david) self.item_3 = MediaItem(id=3, collection=self.collection_nicolas, code="CNRSMH_I_1967_123_456_01", recorded_from_date="1968-01-12", recorded_to_date="1968-02-24", location=self.belgique, ethnic_group=self.b, title="item 3", author="John SMITH", collector="Paul CARLOS", comment="comment 3", ) self.item_3.set_revision(self.user_olivier) self.item_4 = MediaItem(id=4, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_22_33", recorded_from_date="1972-01-12", recorded_to_date="1972-02-24", location=self.europe, ethnic_group=self.a, title="item 4", alt_title="I4", author="Keanu REAVES", collector="Christina BARCELONA", comment="comment 4") self.item_4.set_revision(self.user_olivier) self.item_5 = MediaItem(id=5, collection=self.collection_volonte,code="CNRSMH_I_1960_001_789_85_22", approx_duration="00:05:00", recorded_from_date="1978-01-12", recorded_to_date="1978-02-24", location=self.belgique, ethnic_group=self.a, title="item 5", alt_title="I5", author="Simon PAUL", collector="Javier BARDEM", comment="comment 5") self.item_5.set_revision(self.user_olivier) self.item_6 = MediaItem(id=6, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_90", recorded_from_date="1968-01-12", recorded_to_date="1968-02-11", location=self.france, ethnic_group=self.b, title="item 6", author="Paul ANDERSON", collector="Jim CARLSON", comment="comment 10000") self.item_6.set_revision(self.user_david) self.item_1.save() self.item_2.save() self.item_3.save() self.item_4.save() self.item_5.save() self.item_6.save() self.collections = MediaCollection.objects.all() self.items = MediaItem.objects.all() def tearDown(self): User.objects.all().delete() LocationType.objects.all().delete() Location.objects.all().delete() EthnicGroup.objects.all().delete() MediaCollection.objects.all().delete() MediaItem.objects.all().delete() def testQuickSearchOnCollections(self): "Test quick_search property of MediaCollection class" self.assertEquals(len(self.collections), 3) result = self.collections.quick_search("persepolis") self.assertEquals(len(result), 1) self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(self.collections.quick_search("nietzsche")[0], self.collection_volonte) result = self.collections.quick_search("nicolas") self.assertEquals(result[0], self.collection_nicolas) def testQuickSearchOnItems(self): "Test quick_search property of MediaItem class" result = self.items.quick_search("item").order_by('title') self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6) def testWordSearch(self): "Test quick_search property of MediaCollection class, specificly quick_search on collection title" result = self.collections.quick_search("volonté puissance") self.assertEquals(result[0], self.collection_volonte) result = self.collections.quick_search("puissance volonté") self.assertEquals(result[0], self.collection_volonte) #result = self.collections.quick_search("volonte puissance") #self.assertEquals(result[0], self.collection_volonte) #result = self.collections.quick_search("puissance volonte") #self.assertEquals(result[0], self.collection_volonte) def testLocationSearch(self): "Test by_country and by_continent properties of MediaCollection class" self.assertEquals(self.collections.by_location(self.france)[0], self.collection_persepolis) self.assertEquals(self.collections.by_location(self.europe)[0], self.collection_persepolis) self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[0], self.collection_nicolas) self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[1], self.collection_volonte) def testRecordingYear(self): "Test by_recording_year property of MediaCollection class" self.assertEquals(self.collections.by_recording_year(1970, 1980)[0], self.collection_persepolis) result = self.collections.by_recording_year(1975).order_by("title") self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(result[1], self.collection_volonte) def testPublishYearOnCollection(self): "Test by_publish_year property of MediaCollection class" result=self.collections.by_publish_year(1999).order_by('title') self.assertEquals(result[0], self.collection_nicolas) self.assertEquals(result[1], self.collection_volonte) def testEthnicGroup(self): "Test by_ethnic_group property of MediaCollection class" result=self.collections.by_ethnic_group(self.a).order_by("title") self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(result[1], self.collection_volonte) def testRecordingDate(self): "Test by_recording_date property of MediaItem class" result = self.items.by_recording_date("1968-01-01", "1972-12-12").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_3) self.assertEquals(result[2], self.item_4) self.assertEquals(result[3], self.item_6) result = self.items.by_recording_date("1968-02-06").order_by("title") self.assertEquals(result[0], self.item_3) self.assertEquals(result[1], self.item_6) def testTitle(self): "Test by_title property of MediaItem class" result = self.items.by_title("item").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6) self.item_2.title = '' self.item_2.save() self.item_5.title = '' self.item_5.save() result = self.items.by_title("volonté").order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_5) result = self.items.by_title("puissance volonté").order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_5) def testPublishYearOnItem(self): "Test by_publish_year property of MediaItem class" result = self.items.by_publish_year(1999).order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_3) self.assertEquals(result[2], self.item_5) def testWordSearchCore(self): "Test word_search property of CoreQuerySet class" self.assertEquals(self.collections.word_search("title", "volonté")[0], self.collection_volonte) self.assertEquals(self.collections.word_search("code", "CNRSMH_E_1970_001_002")[0], self.collection_persepolis) self.assertEquals(self.items.word_search("code", "CNRSMH_E_1970_001_002_44")[0], self.item_1) result = self.items.word_search("comment", "comment").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6) @pytest.mark.skip(reason="This test has to be reviewed") def testByChangeTimeOnCollection(self): "Test by_change_time property of MediaCollection class" now = datetime.now() print MediaCollection.objects.all() result = self.collections.by_change_time(now - timedelta(hours=1), now).order_by("title") self.assertEquals(result[0], self.collection_persepolis) @pytest.mark.skip(reason="This test has to be reviewed") def testByChangeTimeOnItem(self): "Test by_change_time property of MediaItem class" now = datetime.now() result = self.items.by_change_time(now - timedelta(hours=1), now).order_by("title") self.assertEquals(result[0], self.item_1) def testWithoutCollection(self): "Test without_collection property of MediaItem class" self.assertEquals(self.items.without_collection().count(), 0) def testCodeRequired(self): "Test that a proper failure occur when a collection code isn't provided" c = MediaCollection(title='test') try: c.save() #c.set_revision(self.user_olivier) except RequiredFieldError, e: self.assertEquals(e.field.name, 'code') else: self.fail("No exception raised") def testDomForeignKey(self): "Test DOM foreign key embedding" doc = self.item_4.to_dom() self.assertEquals(doc.getElementsByTagName('collection')[0].getAttribute('key'), str(self.collection_persepolis.id)) def testLocationRelation(self): "Test location country and continent resolving" self.assertEquals(self.france, self.item_1.location.countries()[0]) self.assertEquals(self.europe, self.item_1.location.continents()[0]) self.assertEquals(self.france, self.item_2.location.countries()[0]) self.assertEquals(self.europe, self.item_2.location.continents()[0]) def testCollectionCountries(self): "Test the MediaCollection.countries() method" self.assertEquals(self.collection_volonte.countries(), [self.belgique, self.france]) class RelatedDeleteTestCase(TestCase): def setUp(self): self.publisher1 = Publisher.objects.create(id=1, value='publisher1') self.publisher2 = Publisher.objects.create(id=2, value='publisher2') self.pubcollection1 = PublisherCollection.objects.create(publisher=self.publisher1, value='pub1_collection1') self.rights1 = LegalRight.objects.create(id=1, value='right1') MediaCollection.objects.create(id=1, code='CNRSMH_I_1256_456', title='Collection1', publisher=self.publisher1, publisher_collection=self.pubcollection1, legal_rights=self.rights1) MediaCollection.objects.create(id=2, code='CNRSMH_I_1256_123', title='Collection2', publisher=self.publisher2) def tearDown(self): Publisher.objects.all().delete() PublisherCollection.objects.all().delete() LegalRight.objects.all().delete() MediaCollection.objects.all().delete() def testOnDeleteSetNull(self): self.rights1.delete() self.assertEquals(LegalRight.objects.filter(id=1).count(), 0) q = MediaCollection.objects.filter(id=1) self.assertEquals(q.count(), 1) self.assertEquals(q[0].legal_rights, None) def testOnDeleteCascade(self): self.publisher1.delete() self.assertEquals(Publisher.objects.filter(id=1).count(), 0) self.assertEquals(Publisher.objects.filter(id=2).count(), 1) self.assertEquals(PublisherCollection.objects.filter(id=1).count(), 0) q = MediaCollection.objects.filter(id=1) self.assertEquals(q.count(), 1) self.assertEquals(q[0].publisher, None) self.assertEquals(q[0].publisher_collection, None) q = MediaCollection.objects.filter(id=2) self.assertEquals(q.count(), 1) self.assertEquals(q[0].publisher, self.publisher2) self.assertEquals(q[0].publisher_collection, None) def testOnDeleteMultiple(self): Publisher.objects.all().delete() self.assertEquals(Publisher.objects.count(), 0) self.assertEquals(PublisherCollection.objects.count(), 0) self.assertEquals(MediaCollection.objects.count(), 2)
Classes
class CollectionItemTestCase
class CollectionItemTestCase(TestCase): def setUp(self): "Create a test database based on objects created in Django" self.user_david = User.objects.create_user(username="david") self.user_olivier = User.objects.create_user(username="olivier") self.country = LocationType.objects.create(code="country", name="Country") self.continent = LocationType.objects.create(code="continent", name="Continent") self.city = LocationType.objects.create(code="city", name="City") self.paris = Location.objects.create(name="Paris", type=Location.OTHER_TYPE, complete_type=self.city) self.france = Location.objects.create(name="France", type=Location.COUNTRY, complete_type=self.country) self.europe = Location.objects.create(name="Europe", type=Location.CONTINENT, complete_type=self.continent) self.belgique = Location.objects.create(name="Belgique", type=Location.COUNTRY, complete_type=self.country) self.europe.add_child(self.france) self.france.add_child(self.paris) self.europe.add_child(self.belgique) self.a = EthnicGroup.objects.create(value="a") self.b = EthnicGroup.objects.create(value="b") self.c = EthnicGroup.objects.create(value="c") self.d = EthnicGroup.objects.create(value="d") self.collection_persepolis = MediaCollection(id=1, code="CNRSMH_E_1970_001_002", reference="A1", title="Persepolis", creator="Abraham LINCOLN", collector="Friedrich HEINZ", year_published=2009, is_published=True, recorded_from_year=1970, recorded_to_year=1980) self.collection_persepolis.set_revision(self.user_david) self.collection_persepolis.save() self.collection_volonte = MediaCollection(id=2, reference="A2", code="CNRSMH_I_1960_001", title="Volonté de puissance", creator="Friedrich NIETZSCHE", collector="Jean AMORA", year_published=1999, recorded_from_year=1960, recorded_to_year=2000) self.collection_volonte.set_revision(self.user_olivier) self.collection_volonte.save() self.collection_nicolas = MediaCollection(id=3, reference="A3", code="CNRSMH_I_1967_123", title="Petit nicolas", creator="Georgette McKenic", collector="Paul MAILLE", year_published=1999, recorded_from_year=1967, recorded_to_year=1968) self.collection_nicolas.set_revision(self.user_olivier) self.collection_nicolas.save() self.item_1 = MediaItem(id=1, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_44", recorded_from_date="1971-01-12", recorded_to_date="1971-02-24", location=self.paris, ethnic_group=self.a, title="item 1", author="Mickael SHEPHERD", collector="Charles PREMIER", comment="comment 1") self.item_1.set_revision(self.user_david) self.item_2 = MediaItem(id=2, collection=self.collection_volonte, code="CNRSMH_I_1960_001_129", recorded_from_date="1981-01-12", recorded_to_date="1991-02-24", location=self.france, ethnic_group=self.a, title="item 2", author="Rick ROLL", comment="comment 2") self.item_2.set_revision(self.user_david) self.item_3 = MediaItem(id=3, collection=self.collection_nicolas, code="CNRSMH_I_1967_123_456_01", recorded_from_date="1968-01-12", recorded_to_date="1968-02-24", location=self.belgique, ethnic_group=self.b, title="item 3", author="John SMITH", collector="Paul CARLOS", comment="comment 3", ) self.item_3.set_revision(self.user_olivier) self.item_4 = MediaItem(id=4, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_22_33", recorded_from_date="1972-01-12", recorded_to_date="1972-02-24", location=self.europe, ethnic_group=self.a, title="item 4", alt_title="I4", author="Keanu REAVES", collector="Christina BARCELONA", comment="comment 4") self.item_4.set_revision(self.user_olivier) self.item_5 = MediaItem(id=5, collection=self.collection_volonte,code="CNRSMH_I_1960_001_789_85_22", approx_duration="00:05:00", recorded_from_date="1978-01-12", recorded_to_date="1978-02-24", location=self.belgique, ethnic_group=self.a, title="item 5", alt_title="I5", author="Simon PAUL", collector="Javier BARDEM", comment="comment 5") self.item_5.set_revision(self.user_olivier) self.item_6 = MediaItem(id=6, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_90", recorded_from_date="1968-01-12", recorded_to_date="1968-02-11", location=self.france, ethnic_group=self.b, title="item 6", author="Paul ANDERSON", collector="Jim CARLSON", comment="comment 10000") self.item_6.set_revision(self.user_david) self.item_1.save() self.item_2.save() self.item_3.save() self.item_4.save() self.item_5.save() self.item_6.save() self.collections = MediaCollection.objects.all() self.items = MediaItem.objects.all() def tearDown(self): User.objects.all().delete() LocationType.objects.all().delete() Location.objects.all().delete() EthnicGroup.objects.all().delete() MediaCollection.objects.all().delete() MediaItem.objects.all().delete() def testQuickSearchOnCollections(self): "Test quick_search property of MediaCollection class" self.assertEquals(len(self.collections), 3) result = self.collections.quick_search("persepolis") self.assertEquals(len(result), 1) self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(self.collections.quick_search("nietzsche")[0], self.collection_volonte) result = self.collections.quick_search("nicolas") self.assertEquals(result[0], self.collection_nicolas) def testQuickSearchOnItems(self): "Test quick_search property of MediaItem class" result = self.items.quick_search("item").order_by('title') self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6) def testWordSearch(self): "Test quick_search property of MediaCollection class, specificly quick_search on collection title" result = self.collections.quick_search("volonté puissance") self.assertEquals(result[0], self.collection_volonte) result = self.collections.quick_search("puissance volonté") self.assertEquals(result[0], self.collection_volonte) #result = self.collections.quick_search("volonte puissance") #self.assertEquals(result[0], self.collection_volonte) #result = self.collections.quick_search("puissance volonte") #self.assertEquals(result[0], self.collection_volonte) def testLocationSearch(self): "Test by_country and by_continent properties of MediaCollection class" self.assertEquals(self.collections.by_location(self.france)[0], self.collection_persepolis) self.assertEquals(self.collections.by_location(self.europe)[0], self.collection_persepolis) self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[0], self.collection_nicolas) self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[1], self.collection_volonte) def testRecordingYear(self): "Test by_recording_year property of MediaCollection class" self.assertEquals(self.collections.by_recording_year(1970, 1980)[0], self.collection_persepolis) result = self.collections.by_recording_year(1975).order_by("title") self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(result[1], self.collection_volonte) def testPublishYearOnCollection(self): "Test by_publish_year property of MediaCollection class" result=self.collections.by_publish_year(1999).order_by('title') self.assertEquals(result[0], self.collection_nicolas) self.assertEquals(result[1], self.collection_volonte) def testEthnicGroup(self): "Test by_ethnic_group property of MediaCollection class" result=self.collections.by_ethnic_group(self.a).order_by("title") self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(result[1], self.collection_volonte) def testRecordingDate(self): "Test by_recording_date property of MediaItem class" result = self.items.by_recording_date("1968-01-01", "1972-12-12").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_3) self.assertEquals(result[2], self.item_4) self.assertEquals(result[3], self.item_6) result = self.items.by_recording_date("1968-02-06").order_by("title") self.assertEquals(result[0], self.item_3) self.assertEquals(result[1], self.item_6) def testTitle(self): "Test by_title property of MediaItem class" result = self.items.by_title("item").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6) self.item_2.title = '' self.item_2.save() self.item_5.title = '' self.item_5.save() result = self.items.by_title("volonté").order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_5) result = self.items.by_title("puissance volonté").order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_5) def testPublishYearOnItem(self): "Test by_publish_year property of MediaItem class" result = self.items.by_publish_year(1999).order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_3) self.assertEquals(result[2], self.item_5) def testWordSearchCore(self): "Test word_search property of CoreQuerySet class" self.assertEquals(self.collections.word_search("title", "volonté")[0], self.collection_volonte) self.assertEquals(self.collections.word_search("code", "CNRSMH_E_1970_001_002")[0], self.collection_persepolis) self.assertEquals(self.items.word_search("code", "CNRSMH_E_1970_001_002_44")[0], self.item_1) result = self.items.word_search("comment", "comment").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6) @pytest.mark.skip(reason="This test has to be reviewed") def testByChangeTimeOnCollection(self): "Test by_change_time property of MediaCollection class" now = datetime.now() print MediaCollection.objects.all() result = self.collections.by_change_time(now - timedelta(hours=1), now).order_by("title") self.assertEquals(result[0], self.collection_persepolis) @pytest.mark.skip(reason="This test has to be reviewed") def testByChangeTimeOnItem(self): "Test by_change_time property of MediaItem class" now = datetime.now() result = self.items.by_change_time(now - timedelta(hours=1), now).order_by("title") self.assertEquals(result[0], self.item_1) def testWithoutCollection(self): "Test without_collection property of MediaItem class" self.assertEquals(self.items.without_collection().count(), 0) def testCodeRequired(self): "Test that a proper failure occur when a collection code isn't provided" c = MediaCollection(title='test') try: c.save() #c.set_revision(self.user_olivier) except RequiredFieldError, e: self.assertEquals(e.field.name, 'code') else: self.fail("No exception raised") def testDomForeignKey(self): "Test DOM foreign key embedding" doc = self.item_4.to_dom() self.assertEquals(doc.getElementsByTagName('collection')[0].getAttribute('key'), str(self.collection_persepolis.id)) def testLocationRelation(self): "Test location country and continent resolving" self.assertEquals(self.france, self.item_1.location.countries()[0]) self.assertEquals(self.europe, self.item_1.location.continents()[0]) self.assertEquals(self.france, self.item_2.location.countries()[0]) self.assertEquals(self.europe, self.item_2.location.continents()[0]) def testCollectionCountries(self): "Test the MediaCollection.countries() method" self.assertEquals(self.collection_volonte.countries(), [self.belgique, self.france])
Ancestors (in MRO)
- CollectionItemTestCase
- django.test.testcases.TestCase
- django.test.testcases.TransactionTestCase
- django.test.testcases.SimpleTestCase
- unittest.case.TestCase
- __builtin__.object
Class variables
var available_apps
var client_class
var failureException
var longMessage
var maxDiff
var reset_sequences
Methods
def __init__(
self, methodName='runTest')
Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name.
def __init__(self, methodName='runTest'): """Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name. """ self._testMethodName = methodName self._resultForDoCleanups = None try: testMethod = getattr(self, methodName) except AttributeError: raise ValueError("no such test method in %s: %s" % (self.__class__, methodName)) self._testMethodDoc = testMethod.__doc__ self._cleanups = [] # Map types to custom assertEqual functions that will compare # instances of said type in more detail to generate a more useful # error message. self._type_equality_funcs = {} self.addTypeEqualityFunc(dict, 'assertDictEqual') self.addTypeEqualityFunc(list, 'assertListEqual') self.addTypeEqualityFunc(tuple, 'assertTupleEqual') self.addTypeEqualityFunc(set, 'assertSetEqual') self.addTypeEqualityFunc(frozenset, 'assertSetEqual') try: self.addTypeEqualityFunc(unicode, 'assertMultiLineEqual') except NameError: # No unicode support in this build pass
def addCleanup(
self, function, *args, **kwargs)
Add a function, with arguments, to be called when the test is completed. Functions added are called on a LIFO basis and are called after tearDown on test failure or success.
Cleanup items are called even if setUp fails (unlike tearDown).
def addCleanup(self, function, *args, **kwargs): """Add a function, with arguments, to be called when the test is completed. Functions added are called on a LIFO basis and are called after tearDown on test failure or success. Cleanup items are called even if setUp fails (unlike tearDown).""" self._cleanups.append((function, args, kwargs))
def addTypeEqualityFunc(
self, typeobj, function)
Add a type specific assertEqual style function to compare a type.
This method is for use by TestCase subclasses that need to register their own type equality functions to provide nicer error messages.
Args: typeobj: The data type to call this function on when both values are of the same type in assertEqual(). function: The callable taking two arguments and an optional msg= argument that raises self.failureException with a useful error message when the two arguments are not equal.
def addTypeEqualityFunc(self, typeobj, function): """Add a type specific assertEqual style function to compare a type. This method is for use by TestCase subclasses that need to register their own type equality functions to provide nicer error messages. Args: typeobj: The data type to call this function on when both values are of the same type in assertEqual(). function: The callable taking two arguments and an optional msg= argument that raises self.failureException with a useful error message when the two arguments are not equal. """ self._type_equality_funcs[typeobj] = function
def assertAlmostEqual(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
If the two objects compare equal then they will automatically compare almost equal.
def assertAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). If the two objects compare equal then they will automatically compare almost equal. """ if first == second: # shortcut return if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if abs(first - second) <= delta: return standardMsg = '%s != %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if round(abs(second-first), places) == 0: return standardMsg = '%s != %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertAlmostEquals(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
If the two objects compare equal then they will automatically compare almost equal.
def assertAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). If the two objects compare equal then they will automatically compare almost equal. """ if first == second: # shortcut return if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if abs(first - second) <= delta: return standardMsg = '%s != %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if round(abs(second-first), places) == 0: return standardMsg = '%s != %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertContains(
self, response, text, count=None, status_code=200, msg_prefix=u'', html=False)
Asserts that a response indicates that some content was retrieved
successfully, (i.e., the HTTP status code was as expected), and that
text
occurs count
times in the content of the response.
If count
is None, the count doesn't matter - the assertion is true
if the text occurs at least once in the response.
def assertContains(self, response, text, count=None, status_code=200, msg_prefix='', html=False): """ Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that ``text`` occurs ``count`` times in the content of the response. If ``count`` is None, the count doesn't matter - the assertion is true if the text occurs at least once in the response. """ # If the response supports deferred rendering and hasn't been rendered # yet, then ensure that it does get rendered before proceeding further. if (hasattr(response, 'render') and callable(response.render) and not response.is_rendered): response.render() if msg_prefix: msg_prefix += ": " self.assertEqual(response.status_code, status_code, msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) if response.streaming: content = b''.join(response.streaming_content) else: content = response.content if not isinstance(text, bytes) or html: text = force_text(text, encoding=response._charset) content = content.decode(response._charset) text_repr = "'%s'" % text else: text_repr = repr(text) if html: content = assert_and_parse_html(self, content, None, "Response's content is not valid HTML:") text = assert_and_parse_html(self, text, None, "Second argument is not valid HTML:") real_count = content.count(text) if count is not None: self.assertEqual(real_count, count, msg_prefix + "Found %d instances of %s in response" " (expected %d)" % (real_count, text_repr, count)) else: self.assertTrue(real_count != 0, msg_prefix + "Couldn't find %s in response" % text_repr)
def assertDictContainsSubset(
self, expected, actual, msg=None)
Checks whether actual is a superset of expected.
def assertDictContainsSubset(self, expected, actual, msg=None): """Checks whether actual is a superset of expected.""" missing = [] mismatched = [] for key, value in expected.iteritems(): if key not in actual: missing.append(key) elif value != actual[key]: mismatched.append('%s, expected: %s, actual: %s' % (safe_repr(key), safe_repr(value), safe_repr(actual[key]))) if not (missing or mismatched): return standardMsg = '' if missing: standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in missing) if mismatched: if standardMsg: standardMsg += '; ' standardMsg += 'Mismatched values: %s' % ','.join(mismatched) self.fail(self._formatMessage(msg, standardMsg))
def assertDictEqual(
self, d1, d2, msg=None)
def assertDictEqual(self, d1, d2, msg=None): self.assertIsInstance(d1, dict, 'First argument is not a dictionary') self.assertIsInstance(d2, dict, 'Second argument is not a dictionary') if d1 != d2: standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True)) diff = ('\n' + '\n'.join(difflib.ndiff( pprint.pformat(d1).splitlines(), pprint.pformat(d2).splitlines()))) standardMsg = self._truncateMessage(standardMsg, diff) self.fail(self._formatMessage(msg, standardMsg))
def assertEqual(
self, first, second, msg=None)
Fail if the two objects are unequal as determined by the '==' operator.
def assertEqual(self, first, second, msg=None): """Fail if the two objects are unequal as determined by the '==' operator. """ assertion_func = self._getAssertEqualityFunc(first, second) assertion_func(first, second, msg=msg)
def assertEquals(
self, first, second, msg=None)
Fail if the two objects are unequal as determined by the '==' operator.
def assertEqual(self, first, second, msg=None): """Fail if the two objects are unequal as determined by the '==' operator. """ assertion_func = self._getAssertEqualityFunc(first, second) assertion_func(first, second, msg=msg)
def assertFalse(
self, expr, msg=None)
Check that the expression is false.
def assertFalse(self, expr, msg=None): """Check that the expression is false.""" if expr: msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr)) raise self.failureException(msg)
def assertFieldOutput(
self, fieldclass, valid, invalid, field_args=None, field_kwargs=None, empty_value=u'')
Asserts that a form field behaves correctly with various inputs.
Args: fieldclass: the class of the field to be tested. valid: a dictionary mapping valid inputs to their expected cleaned values. invalid: a dictionary mapping invalid inputs to one or more raised error messages. field_args: the args passed to instantiate the field field_kwargs: the kwargs passed to instantiate the field empty_value: the expected clean output for inputs in empty_values
def assertFieldOutput(self, fieldclass, valid, invalid, field_args=None, field_kwargs=None, empty_value=''): """ Asserts that a form field behaves correctly with various inputs. Args: fieldclass: the class of the field to be tested. valid: a dictionary mapping valid inputs to their expected cleaned values. invalid: a dictionary mapping invalid inputs to one or more raised error messages. field_args: the args passed to instantiate the field field_kwargs: the kwargs passed to instantiate the field empty_value: the expected clean output for inputs in empty_values """ if field_args is None: field_args = [] if field_kwargs is None: field_kwargs = {} required = fieldclass(*field_args, **field_kwargs) optional = fieldclass(*field_args, **dict(field_kwargs, required=False)) # test valid inputs for input, output in valid.items(): self.assertEqual(required.clean(input), output) self.assertEqual(optional.clean(input), output) # test invalid inputs for input, errors in invalid.items(): with self.assertRaises(ValidationError) as context_manager: required.clean(input) self.assertEqual(context_manager.exception.messages, errors) with self.assertRaises(ValidationError) as context_manager: optional.clean(input) self.assertEqual(context_manager.exception.messages, errors) # test required inputs error_required = [force_text(required.error_messages['required'])] for e in required.empty_values: with self.assertRaises(ValidationError) as context_manager: required.clean(e) self.assertEqual(context_manager.exception.messages, error_required) self.assertEqual(optional.clean(e), empty_value) # test that max_length and min_length are always accepted if issubclass(fieldclass, CharField): field_kwargs.update({'min_length':2, 'max_length':20}) self.assertTrue(isinstance(fieldclass(*field_args, **field_kwargs), fieldclass))
def assertFormError(
self, response, form, field, errors, msg_prefix=u'')
Asserts that a form used to render the response has a specific field error.
def assertFormError(self, response, form, field, errors, msg_prefix=''): """ Asserts that a form used to render the response has a specific field error. """ if msg_prefix: msg_prefix += ": " # Put context(s) into a list to simplify processing. contexts = to_list(response.context) if not contexts: self.fail(msg_prefix + "Response did not use any contexts to " "render the response") # Put error(s) into a list to simplify processing. errors = to_list(errors) # Search all contexts for the error. found_form = False for i,context in enumerate(contexts): if form not in context: continue found_form = True for err in errors: if field: if field in context[form].errors: field_errors = context[form].errors[field] self.assertTrue(err in field_errors, msg_prefix + "The field '%s' on form '%s' in" " context %d does not contain the error '%s'" " (actual errors: %s)" % (field, form, i, err, repr(field_errors))) elif field in context[form].fields: self.fail(msg_prefix + "The field '%s' on form '%s'" " in context %d contains no errors" % (field, form, i)) else: self.fail(msg_prefix + "The form '%s' in context %d" " does not contain the field '%s'" % (form, i, field)) else: non_field_errors = context[form].non_field_errors() self.assertTrue(err in non_field_errors, msg_prefix + "The form '%s' in context %d does not" " contain the non-field error '%s'" " (actual errors: %s)" % (form, i, err, non_field_errors)) if not found_form: self.fail(msg_prefix + "The form '%s' was not used to render the" " response" % form)
def assertFormsetError(
self, response, formset, form_index, field, errors, msg_prefix=u'')
Asserts that a formset used to render the response has a specific error.
For field errors, specify the form_index
and the field
.
For non-field errors, specify the form_index
and the field
as
None.
For non-form errors, specify form_index
as None and the field
as None.
def assertFormsetError(self, response, formset, form_index, field, errors, msg_prefix=''): """ Asserts that a formset used to render the response has a specific error. For field errors, specify the ``form_index`` and the ``field``. For non-field errors, specify the ``form_index`` and the ``field`` as None. For non-form errors, specify ``form_index`` as None and the ``field`` as None. """ # Add punctuation to msg_prefix if msg_prefix: msg_prefix += ": " # Put context(s) into a list to simplify processing. contexts = to_list(response.context) if not contexts: self.fail(msg_prefix + 'Response did not use any contexts to ' 'render the response') # Put error(s) into a list to simplify processing. errors = to_list(errors) # Search all contexts for the error. found_formset = False for i, context in enumerate(contexts): if formset not in context: continue found_formset = True for err in errors: if field is not None: if field in context[formset].forms[form_index].errors: field_errors = context[formset].forms[form_index].errors[field] self.assertTrue(err in field_errors, msg_prefix + "The field '%s' on formset '%s', " "form %d in context %d does not contain the " "error '%s' (actual errors: %s)" % (field, formset, form_index, i, err, repr(field_errors))) elif field in context[formset].forms[form_index].fields: self.fail(msg_prefix + "The field '%s' " "on formset '%s', form %d in " "context %d contains no errors" % (field, formset, form_index, i)) else: self.fail(msg_prefix + "The formset '%s', form %d in " "context %d does not contain the field '%s'" % (formset, form_index, i, field)) elif form_index is not None: non_field_errors = context[formset].forms[form_index].non_field_errors() self.assertFalse(len(non_field_errors) == 0, msg_prefix + "The formset '%s', form %d in " "context %d does not contain any non-field " "errors." % (formset, form_index, i)) self.assertTrue(err in non_field_errors, msg_prefix + "The formset '%s', form %d " "in context %d does not contain the " "non-field error '%s' " "(actual errors: %s)" % (formset, form_index, i, err, repr(non_field_errors))) else: non_form_errors = context[formset].non_form_errors() self.assertFalse(len(non_form_errors) == 0, msg_prefix + "The formset '%s' in " "context %d does not contain any " "non-form errors." % (formset, i)) self.assertTrue(err in non_form_errors, msg_prefix + "The formset '%s' in context " "%d does not contain the " "non-form error '%s' (actual errors: %s)" % (formset, i, err, repr(non_form_errors))) if not found_formset: self.fail(msg_prefix + "The formset '%s' was not used to render " "the response" % formset)
def assertGreater(
self, a, b, msg=None)
Just like self.assertTrue(a > b), but with a nicer default message.
def assertGreater(self, a, b, msg=None): """Just like self.assertTrue(a > b), but with a nicer default message.""" if not a > b: standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertGreaterEqual(
self, a, b, msg=None)
Just like self.assertTrue(a >= b), but with a nicer default message.
def assertGreaterEqual(self, a, b, msg=None): """Just like self.assertTrue(a >= b), but with a nicer default message.""" if not a >= b: standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertHTMLEqual(
self, html1, html2, msg=None)
Asserts that two HTML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid HTML.
def assertHTMLEqual(self, html1, html2, msg=None): """ Asserts that two HTML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid HTML. """ dom1 = assert_and_parse_html(self, html1, msg, 'First argument is not valid HTML:') dom2 = assert_and_parse_html(self, html2, msg, 'Second argument is not valid HTML:') if dom1 != dom2: standardMsg = '%s != %s' % ( safe_repr(dom1, True), safe_repr(dom2, True)) diff = ('\n' + '\n'.join(difflib.ndiff( six.text_type(dom1).splitlines(), six.text_type(dom2).splitlines()))) standardMsg = self._truncateMessage(standardMsg, diff) self.fail(self._formatMessage(msg, standardMsg))
def assertHTMLNotEqual(
self, html1, html2, msg=None)
Asserts that two HTML snippets are not semantically equivalent.
def assertHTMLNotEqual(self, html1, html2, msg=None): """Asserts that two HTML snippets are not semantically equivalent.""" dom1 = assert_and_parse_html(self, html1, msg, 'First argument is not valid HTML:') dom2 = assert_and_parse_html(self, html2, msg, 'Second argument is not valid HTML:') if dom1 == dom2: standardMsg = '%s == %s' % ( safe_repr(dom1, True), safe_repr(dom2, True)) self.fail(self._formatMessage(msg, standardMsg))
def assertIn(
self, member, container, msg=None)
Just like self.assertTrue(a in b), but with a nicer default message.
def assertIn(self, member, container, msg=None): """Just like self.assertTrue(a in b), but with a nicer default message.""" if member not in container: standardMsg = '%s not found in %s' % (safe_repr(member), safe_repr(container)) self.fail(self._formatMessage(msg, standardMsg))
def assertInHTML(
self, needle, haystack, count=None, msg_prefix=u'')
def assertInHTML(self, needle, haystack, count=None, msg_prefix=''): needle = assert_and_parse_html(self, needle, None, 'First argument is not valid HTML:') haystack = assert_and_parse_html(self, haystack, None, 'Second argument is not valid HTML:') real_count = haystack.count(needle) if count is not None: self.assertEqual(real_count, count, msg_prefix + "Found %d instances of '%s' in response" " (expected %d)" % (real_count, needle, count)) else: self.assertTrue(real_count != 0, msg_prefix + "Couldn't find '%s' in response" % needle)
def assertIs(
self, expr1, expr2, msg=None)
Just like self.assertTrue(a is b), but with a nicer default message.
def assertIs(self, expr1, expr2, msg=None): """Just like self.assertTrue(a is b), but with a nicer default message.""" if expr1 is not expr2: standardMsg = '%s is not %s' % (safe_repr(expr1), safe_repr(expr2)) self.fail(self._formatMessage(msg, standardMsg))
def assertIsInstance(
self, obj, cls, msg=None)
Same as self.assertTrue(isinstance(obj, cls)), with a nicer default message.
def assertIsInstance(self, obj, cls, msg=None): """Same as self.assertTrue(isinstance(obj, cls)), with a nicer default message.""" if not isinstance(obj, cls): standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls) self.fail(self._formatMessage(msg, standardMsg))
def assertIsNone(
self, obj, msg=None)
Same as self.assertTrue(obj is None), with a nicer default message.
def assertIsNone(self, obj, msg=None): """Same as self.assertTrue(obj is None), with a nicer default message.""" if obj is not None: standardMsg = '%s is not None' % (safe_repr(obj),) self.fail(self._formatMessage(msg, standardMsg))
def assertIsNot(
self, expr1, expr2, msg=None)
Just like self.assertTrue(a is not b), but with a nicer default message.
def assertIsNot(self, expr1, expr2, msg=None): """Just like self.assertTrue(a is not b), but with a nicer default message.""" if expr1 is expr2: standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),) self.fail(self._formatMessage(msg, standardMsg))
def assertIsNotNone(
self, obj, msg=None)
Included for symmetry with assertIsNone.
def assertIsNotNone(self, obj, msg=None): """Included for symmetry with assertIsNone.""" if obj is None: standardMsg = 'unexpectedly None' self.fail(self._formatMessage(msg, standardMsg))
def assertItemsEqual(
self, expected_seq, actual_seq, msg=None)
An unordered sequence specific comparison. It asserts that actual_seq and expected_seq have the same element counts. Equivalent to::
self.assertEqual(Counter(iter(actual_seq)), Counter(iter(expected_seq)))
Asserts that each element has the same count in both sequences. Example: - [0, 1, 1] and [1, 0, 1] compare equal. - [0, 0, 1] and [0, 1] compare unequal.
def assertItemsEqual(self, expected_seq, actual_seq, msg=None): """An unordered sequence specific comparison. It asserts that actual_seq and expected_seq have the same element counts. Equivalent to:: self.assertEqual(Counter(iter(actual_seq)), Counter(iter(expected_seq))) Asserts that each element has the same count in both sequences. Example: - [0, 1, 1] and [1, 0, 1] compare equal. - [0, 0, 1] and [0, 1] compare unequal. """ first_seq, second_seq = list(expected_seq), list(actual_seq) with warnings.catch_warnings(): if sys.py3kwarning: # Silence Py3k warning raised during the sorting for _msg in ["(code|dict|type) inequality comparisons", "builtin_function_or_method order comparisons", "comparing unequal types"]: warnings.filterwarnings("ignore", _msg, DeprecationWarning) try: first = collections.Counter(first_seq) second = collections.Counter(second_seq) except TypeError: # Handle case with unhashable elements differences = _count_diff_all_purpose(first_seq, second_seq) else: if first == second: return differences = _count_diff_hashable(first_seq, second_seq) if differences: standardMsg = 'Element counts were not equal:\n' lines = ['First has %d, Second has %d: %r' % diff for diff in differences] diffMsg = '\n'.join(lines) standardMsg = self._truncateMessage(standardMsg, diffMsg) msg = self._formatMessage(msg, standardMsg) self.fail(msg)
def assertJSONEqual(
self, raw, expected_data, msg=None)
def assertJSONEqual(self, raw, expected_data, msg=None): try: data = json.loads(raw) except ValueError: self.fail("First argument is not valid JSON: %r" % raw) if isinstance(expected_data, six.string_types): try: expected_data = json.loads(expected_data) except ValueError: self.fail("Second argument is not valid JSON: %r" % expected_data) self.assertEqual(data, expected_data, msg=msg)
def assertLess(
self, a, b, msg=None)
Just like self.assertTrue(a < b), but with a nicer default message.
def assertLess(self, a, b, msg=None): """Just like self.assertTrue(a < b), but with a nicer default message.""" if not a < b: standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertLessEqual(
self, a, b, msg=None)
Just like self.assertTrue(a <= b), but with a nicer default message.
def assertLessEqual(self, a, b, msg=None): """Just like self.assertTrue(a <= b), but with a nicer default message.""" if not a <= b: standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertListEqual(
self, list1, list2, msg=None)
A list-specific equality assertion.
Args: list1: The first list to compare. list2: The second list to compare. msg: Optional message to use on failure instead of a list of differences.
def assertListEqual(self, list1, list2, msg=None): """A list-specific equality assertion. Args: list1: The first list to compare. list2: The second list to compare. msg: Optional message to use on failure instead of a list of differences. """ self.assertSequenceEqual(list1, list2, msg, seq_type=list)
def assertMultiLineEqual(
self, first, second, msg=None)
Assert that two multi-line strings are equal.
def assertMultiLineEqual(self, first, second, msg=None): """Assert that two multi-line strings are equal.""" self.assertIsInstance(first, basestring, 'First argument is not a string') self.assertIsInstance(second, basestring, 'Second argument is not a string') if first != second: # don't use difflib if the strings are too long if (len(first) > self._diffThreshold or len(second) > self._diffThreshold): self._baseAssertEqual(first, second, msg) firstlines = first.splitlines(True) secondlines = second.splitlines(True) if len(firstlines) == 1 and first.strip('\r\n') == first: firstlines = [first + '\n'] secondlines = [second + '\n'] standardMsg = '%s != %s' % (safe_repr(first, True), safe_repr(second, True)) diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines)) standardMsg = self._truncateMessage(standardMsg, diff) self.fail(self._formatMessage(msg, standardMsg))
def assertNotAlmostEqual(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
Objects that are equal automatically fail.
def assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). Objects that are equal automatically fail. """ if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if not (first == second) and abs(first - second) > delta: return standardMsg = '%s == %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if not (first == second) and round(abs(second-first), places) != 0: return standardMsg = '%s == %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertNotAlmostEquals(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
Objects that are equal automatically fail.
def assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). Objects that are equal automatically fail. """ if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if not (first == second) and abs(first - second) > delta: return standardMsg = '%s == %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if not (first == second) and round(abs(second-first), places) != 0: return standardMsg = '%s == %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertNotContains(
self, response, text, status_code=200, msg_prefix=u'', html=False)
Asserts that a response indicates that some content was retrieved
successfully, (i.e., the HTTP status code was as expected), and that
text
doesn't occurs in the content of the response.
def assertNotContains(self, response, text, status_code=200, msg_prefix='', html=False): """ Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that ``text`` doesn't occurs in the content of the response. """ # If the response supports deferred rendering and hasn't been rendered # yet, then ensure that it does get rendered before proceeding further. if (hasattr(response, 'render') and callable(response.render) and not response.is_rendered): response.render() if msg_prefix: msg_prefix += ": " self.assertEqual(response.status_code, status_code, msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) content = response.content if not isinstance(text, bytes) or html: text = force_text(text, encoding=response._charset) content = content.decode(response._charset) text_repr = "'%s'" % text else: text_repr = repr(text) if html: content = assert_and_parse_html(self, content, None, 'Response\'s content is not valid HTML:') text = assert_and_parse_html(self, text, None, 'Second argument is not valid HTML:') self.assertEqual(content.count(text), 0, msg_prefix + "Response should not contain %s" % text_repr)
def assertNotEqual(
self, first, second, msg=None)
Fail if the two objects are equal as determined by the '!=' operator.
def assertNotEqual(self, first, second, msg=None): """Fail if the two objects are equal as determined by the '!=' operator. """ if not first != second: msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first), safe_repr(second))) raise self.failureException(msg)
def assertNotEquals(
self, first, second, msg=None)
Fail if the two objects are equal as determined by the '!=' operator.
def assertNotEqual(self, first, second, msg=None): """Fail if the two objects are equal as determined by the '!=' operator. """ if not first != second: msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first), safe_repr(second))) raise self.failureException(msg)
def assertNotIn(
self, member, container, msg=None)
Just like self.assertTrue(a not in b), but with a nicer default message.
def assertNotIn(self, member, container, msg=None): """Just like self.assertTrue(a not in b), but with a nicer default message.""" if member in container: standardMsg = '%s unexpectedly found in %s' % (safe_repr(member), safe_repr(container)) self.fail(self._formatMessage(msg, standardMsg))
def assertNotIsInstance(
self, obj, cls, msg=None)
Included for symmetry with assertIsInstance.
def assertNotIsInstance(self, obj, cls, msg=None): """Included for symmetry with assertIsInstance.""" if isinstance(obj, cls): standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls) self.fail(self._formatMessage(msg, standardMsg))
def assertNotRegexpMatches(
self, text, unexpected_regexp, msg=None)
Fail the test if the text matches the regular expression.
def assertNotRegexpMatches(self, text, unexpected_regexp, msg=None): """Fail the test if the text matches the regular expression.""" if isinstance(unexpected_regexp, basestring): unexpected_regexp = re.compile(unexpected_regexp) match = unexpected_regexp.search(text) if match: msg = msg or "Regexp matched" msg = '%s: %r matches %r in %r' % (msg, text[match.start():match.end()], unexpected_regexp.pattern, text) raise self.failureException(msg)
def assertNumQueries(
self, num, func=None, *args, **kwargs)
def assertNumQueries(self, num, func=None, *args, **kwargs): using = kwargs.pop("using", DEFAULT_DB_ALIAS) conn = connections[using] context = _AssertNumQueriesContext(self, num, conn) if func is None: return context with context: func(*args, **kwargs)
def assertQuerysetEqual(
self, qs, values, transform=<built-in function repr>, ordered=True)
def assertQuerysetEqual(self, qs, values, transform=repr, ordered=True): items = six.moves.map(transform, qs) if not ordered: return self.assertEqual(set(items), set(values)) values = list(values) # For example qs.iterator() could be passed as qs, but it does not # have 'ordered' attribute. if len(values) > 1 and hasattr(qs, 'ordered') and not qs.ordered: raise ValueError("Trying to compare non-ordered queryset " "against more than one ordered values") return self.assertEqual(list(items), values)
def assertRaises(
self, excClass, callableObj=None, *args, **kwargs)
Fail unless an exception of class excClass is raised by callableObj when invoked with arguments args and keyword arguments kwargs. If a different type of exception is raised, it will not be caught, and the test case will be deemed to have suffered an error, exactly as for an unexpected exception.
If called with callableObj omitted or None, will return a context object used like this::
with self.assertRaises(SomeException): do_something()
The context manager keeps a reference to the exception as the 'exception' attribute. This allows you to inspect the exception after the assertion::
with self.assertRaises(SomeException) as cm: do_something() the_exception = cm.exception self.assertEqual(the_exception.error_code, 3)
def assertRaises(self, excClass, callableObj=None, *args, **kwargs): """Fail unless an exception of class excClass is raised by callableObj when invoked with arguments args and keyword arguments kwargs. If a different type of exception is raised, it will not be caught, and the test case will be deemed to have suffered an error, exactly as for an unexpected exception. If called with callableObj omitted or None, will return a context object used like this:: with self.assertRaises(SomeException): do_something() The context manager keeps a reference to the exception as the 'exception' attribute. This allows you to inspect the exception after the assertion:: with self.assertRaises(SomeException) as cm: do_something() the_exception = cm.exception self.assertEqual(the_exception.error_code, 3) """ context = _AssertRaisesContext(excClass, self) if callableObj is None: return context with context: callableObj(*args, **kwargs)
def assertRaisesMessage(
self, expected_exception, expected_message, callable_obj=None, *args, **kwargs)
Asserts that the message in a raised exception matches the passed value.
Args: expected_exception: Exception class expected to be raised. expected_message: expected error message string value. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs.
def assertRaisesMessage(self, expected_exception, expected_message, callable_obj=None, *args, **kwargs): """ Asserts that the message in a raised exception matches the passed value. Args: expected_exception: Exception class expected to be raised. expected_message: expected error message string value. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs. """ return six.assertRaisesRegex(self, expected_exception, re.escape(expected_message), callable_obj, *args, **kwargs)
def assertRaisesRegexp(
self, expected_exception, expected_regexp, callable_obj=None, *args, **kwargs)
Asserts that the message in a raised exception matches a regexp.
Args: expected_exception: Exception class expected to be raised. expected_regexp: Regexp (re pattern object or string) expected to be found in error message. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs.
def assertRaisesRegexp(self, expected_exception, expected_regexp, callable_obj=None, *args, **kwargs): """Asserts that the message in a raised exception matches a regexp. Args: expected_exception: Exception class expected to be raised. expected_regexp: Regexp (re pattern object or string) expected to be found in error message. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs. """ if expected_regexp is not None: expected_regexp = re.compile(expected_regexp) context = _AssertRaisesContext(expected_exception, self, expected_regexp) if callable_obj is None: return context with context: callable_obj(*args, **kwargs)
def assertRedirects(
self, response, expected_url, status_code=302, target_status_code=200, host=None, msg_prefix=u'')
Asserts that a response redirected to a specific URL, and that the redirect URL can be loaded.
Note that assertRedirects won't work for external links since it uses TestClient to do a request.
def assertRedirects(self, response, expected_url, status_code=302, target_status_code=200, host=None, msg_prefix=''): """Asserts that a response redirected to a specific URL, and that the redirect URL can be loaded. Note that assertRedirects won't work for external links since it uses TestClient to do a request. """ if msg_prefix: msg_prefix += ": " if hasattr(response, 'redirect_chain'): # The request was a followed redirect self.assertTrue(len(response.redirect_chain) > 0, msg_prefix + "Response didn't redirect as expected: Response" " code was %d (expected %d)" % (response.status_code, status_code)) self.assertEqual(response.redirect_chain[0][1], status_code, msg_prefix + "Initial response didn't redirect as expected:" " Response code was %d (expected %d)" % (response.redirect_chain[0][1], status_code)) url, status_code = response.redirect_chain[-1] self.assertEqual(response.status_code, target_status_code, msg_prefix + "Response didn't redirect as expected: Final" " Response code was %d (expected %d)" % (response.status_code, target_status_code)) else: # Not a followed redirect self.assertEqual(response.status_code, status_code, msg_prefix + "Response didn't redirect as expected: Response" " code was %d (expected %d)" % (response.status_code, status_code)) url = response.url scheme, netloc, path, query, fragment = urlsplit(url) redirect_response = response.client.get(path, QueryDict(query)) # Get the redirection page, using the same client that was used # to obtain the original response. self.assertEqual(redirect_response.status_code, target_status_code, msg_prefix + "Couldn't retrieve redirection page '%s':" " response code was %d (expected %d)" % (path, redirect_response.status_code, target_status_code)) e_scheme, e_netloc, e_path, e_query, e_fragment = urlsplit( expected_url) if not (e_scheme or e_netloc): expected_url = urlunsplit(('http', host or 'testserver', e_path, e_query, e_fragment)) self.assertEqual(url, expected_url, msg_prefix + "Response redirected to '%s', expected '%s'" % (url, expected_url))
def assertRegexpMatches(
self, text, expected_regexp, msg=None)
Fail the test unless the text matches the regular expression.
def assertRegexpMatches(self, text, expected_regexp, msg=None): """Fail the test unless the text matches the regular expression.""" if isinstance(expected_regexp, basestring): expected_regexp = re.compile(expected_regexp) if not expected_regexp.search(text): msg = msg or "Regexp didn't match" msg = '%s: %r not found in %r' % (msg, expected_regexp.pattern, text) raise self.failureException(msg)
def assertSequenceEqual(
self, seq1, seq2, msg=None, seq_type=None)
An equality assertion for ordered sequences (like lists and tuples).
For the purposes of this function, a valid ordered sequence type is one which can be indexed, has a length, and has an equality operator.
Args: seq1: The first sequence to compare. seq2: The second sequence to compare. seq_type: The expected datatype of the sequences, or None if no datatype should be enforced. msg: Optional message to use on failure instead of a list of differences.
def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None): """An equality assertion for ordered sequences (like lists and tuples). For the purposes of this function, a valid ordered sequence type is one which can be indexed, has a length, and has an equality operator. Args: seq1: The first sequence to compare. seq2: The second sequence to compare. seq_type: The expected datatype of the sequences, or None if no datatype should be enforced. msg: Optional message to use on failure instead of a list of differences. """ if seq_type is not None: seq_type_name = seq_type.__name__ if not isinstance(seq1, seq_type): raise self.failureException('First sequence is not a %s: %s' % (seq_type_name, safe_repr(seq1))) if not isinstance(seq2, seq_type): raise self.failureException('Second sequence is not a %s: %s' % (seq_type_name, safe_repr(seq2))) else: seq_type_name = "sequence" differing = None try: len1 = len(seq1) except (TypeError, NotImplementedError): differing = 'First %s has no length. Non-sequence?' % ( seq_type_name) if differing is None: try: len2 = len(seq2) except (TypeError, NotImplementedError): differing = 'Second %s has no length. Non-sequence?' % ( seq_type_name) if differing is None: if seq1 == seq2: return seq1_repr = safe_repr(seq1) seq2_repr = safe_repr(seq2) if len(seq1_repr) > 30: seq1_repr = seq1_repr[:30] + '...' if len(seq2_repr) > 30: seq2_repr = seq2_repr[:30] + '...' elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr) differing = '%ss differ: %s != %s\n' % elements for i in xrange(min(len1, len2)): try: item1 = seq1[i] except (TypeError, IndexError, NotImplementedError): differing += ('\nUnable to index element %d of first %s\n' % (i, seq_type_name)) break try: item2 = seq2[i] except (TypeError, IndexError, NotImplementedError): differing += ('\nUnable to index element %d of second %s\n' % (i, seq_type_name)) break if item1 != item2: differing += ('\nFirst differing element %d:\n%s\n%s\n' % (i, safe_repr(item1), safe_repr(item2))) break else: if (len1 == len2 and seq_type is None and type(seq1) != type(seq2)): # The sequences are the same, but have differing types. return if len1 > len2: differing += ('\nFirst %s contains %d additional ' 'elements.\n' % (seq_type_name, len1 - len2)) try: differing += ('First extra element %d:\n%s\n' % (len2, safe_repr(seq1[len2]))) except (TypeError, IndexError, NotImplementedError): differing += ('Unable to index element %d ' 'of first %s\n' % (len2, seq_type_name)) elif len1 < len2: differing += ('\nSecond %s contains %d additional ' 'elements.\n' % (seq_type_name, len2 - len1)) try: differing += ('First extra element %d:\n%s\n' % (len1, safe_repr(seq2[len1]))) except (TypeError, IndexError, NotImplementedError): differing += ('Unable to index element %d ' 'of second %s\n' % (len1, seq_type_name)) standardMsg = differing diffMsg = '\n' + '\n'.join( difflib.ndiff(pprint.pformat(seq1).splitlines(), pprint.pformat(seq2).splitlines())) standardMsg = self._truncateMessage(standardMsg, diffMsg) msg = self._formatMessage(msg, standardMsg) self.fail(msg)
def assertSetEqual(
self, set1, set2, msg=None)
A set-specific equality assertion.
Args: set1: The first set to compare. set2: The second set to compare. msg: Optional message to use on failure instead of a list of differences.
assertSetEqual uses ducktyping to support different types of sets, and is optimized for sets specifically (parameters must support a difference method).
def assertSetEqual(self, set1, set2, msg=None): """A set-specific equality assertion. Args: set1: The first set to compare. set2: The second set to compare. msg: Optional message to use on failure instead of a list of differences. assertSetEqual uses ducktyping to support different types of sets, and is optimized for sets specifically (parameters must support a difference method). """ try: difference1 = set1.difference(set2) except TypeError, e: self.fail('invalid type when attempting set difference: %s' % e) except AttributeError, e: self.fail('first argument does not support set difference: %s' % e) try: difference2 = set2.difference(set1) except TypeError, e: self.fail('invalid type when attempting set difference: %s' % e) except AttributeError, e: self.fail('second argument does not support set difference: %s' % e) if not (difference1 or difference2): return lines = [] if difference1: lines.append('Items in the first set but not the second:') for item in difference1: lines.append(repr(item)) if difference2: lines.append('Items in the second set but not the first:') for item in difference2: lines.append(repr(item)) standardMsg = '\n'.join(lines) self.fail(self._formatMessage(msg, standardMsg))
def assertTemplateNotUsed(
self, response=None, template_name=None, msg_prefix=u'')
Asserts that the template with the provided name was NOT used in rendering the response. Also usable as context manager.
def assertTemplateNotUsed(self, response=None, template_name=None, msg_prefix=''): """ Asserts that the template with the provided name was NOT used in rendering the response. Also usable as context manager. """ if response is None and template_name is None: raise TypeError('response and/or template_name argument must be provided') if msg_prefix: msg_prefix += ": " # Use assertTemplateUsed as context manager. if not hasattr(response, 'templates') or (response is None and template_name): if response: template_name = response response = None context = _AssertTemplateNotUsedContext(self, template_name) return context template_names = [t.name for t in response.templates] self.assertFalse(template_name in template_names, msg_prefix + "Template '%s' was used unexpectedly in rendering" " the response" % template_name)
def assertTemplateUsed(
self, response=None, template_name=None, msg_prefix=u'')
Asserts that the template with the provided name was used in rendering the response. Also usable as context manager.
def assertTemplateUsed(self, response=None, template_name=None, msg_prefix=''): """ Asserts that the template with the provided name was used in rendering the response. Also usable as context manager. """ if response is None and template_name is None: raise TypeError('response and/or template_name argument must be provided') if msg_prefix: msg_prefix += ": " # Use assertTemplateUsed as context manager. if not hasattr(response, 'templates') or (response is None and template_name): if response: template_name = response response = None context = _AssertTemplateUsedContext(self, template_name) return context template_names = [t.name for t in response.templates] if not template_names: self.fail(msg_prefix + "No templates used to render the response") self.assertTrue(template_name in template_names, msg_prefix + "Template '%s' was not a template used to render" " the response. Actual template(s) used: %s" % (template_name, ', '.join(template_names)))
def assertTrue(
self, expr, msg=None)
Check that the expression is true.
def assertTrue(self, expr, msg=None): """Check that the expression is true.""" if not expr: msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr)) raise self.failureException(msg)
def assertTupleEqual(
self, tuple1, tuple2, msg=None)
A tuple-specific equality assertion.
Args: tuple1: The first tuple to compare. tuple2: The second tuple to compare. msg: Optional message to use on failure instead of a list of differences.
def assertTupleEqual(self, tuple1, tuple2, msg=None): """A tuple-specific equality assertion. Args: tuple1: The first tuple to compare. tuple2: The second tuple to compare. msg: Optional message to use on failure instead of a list of differences. """ self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
def assertXMLEqual(
self, xml1, xml2, msg=None)
Asserts that two XML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML.
def assertXMLEqual(self, xml1, xml2, msg=None): """ Asserts that two XML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML. """ try: result = compare_xml(xml1, xml2) except Exception as e: standardMsg = 'First or second argument is not valid XML\n%s' % e self.fail(self._formatMessage(msg, standardMsg)) else: if not result: standardMsg = '%s != %s' % (safe_repr(xml1, True), safe_repr(xml2, True)) self.fail(self._formatMessage(msg, standardMsg))
def assertXMLNotEqual(
self, xml1, xml2, msg=None)
Asserts that two XML snippets are not semantically equivalent. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML.
def assertXMLNotEqual(self, xml1, xml2, msg=None): """ Asserts that two XML snippets are not semantically equivalent. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML. """ try: result = compare_xml(xml1, xml2) except Exception as e: standardMsg = 'First or second argument is not valid XML\n%s' % e self.fail(self._formatMessage(msg, standardMsg)) else: if result: standardMsg = '%s == %s' % (safe_repr(xml1, True), safe_repr(xml2, True)) self.fail(self._formatMessage(msg, standardMsg))
def assert_(
self, expr, msg=None)
Check that the expression is true.
def assertTrue(self, expr, msg=None): """Check that the expression is true.""" if not expr: msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr)) raise self.failureException(msg)
def countTestCases(
self)
def countTestCases(self): return 1
def debug(
self)
Run the test without collecting errors in a TestResult
def debug(self): """Run the test without collecting errors in a TestResult""" self.setUp() getattr(self, self._testMethodName)() self.tearDown() while self._cleanups: function, args, kwargs = self._cleanups.pop(-1) function(*args, **kwargs)
def defaultTestResult(
self)
def defaultTestResult(self): return result.TestResult()
def doCleanups(
self)
Execute all cleanup functions. Normally called for you after tearDown.
def doCleanups(self): """Execute all cleanup functions. Normally called for you after tearDown.""" result = self._resultForDoCleanups ok = True while self._cleanups: function, args, kwargs = self._cleanups.pop(-1) try: function(*args, **kwargs) except KeyboardInterrupt: raise except: ok = False result.addError(self, sys.exc_info()) return ok
def fail(
self, msg=None)
Fail immediately, with the given message.
def fail(self, msg=None): """Fail immediately, with the given message.""" raise self.failureException(msg)
def failIf(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failIfAlmostEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failIfEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnless(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnlessAlmostEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnlessEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnlessRaises(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def id(
self)
def id(self): return "%s.%s" % (strclass(self.__class__), self._testMethodName)
def restore_warnings_state(
self)
Restores the state of the warnings module to the state saved by save_warnings_state()
def restore_warnings_state(self): """ Restores the state of the warnings module to the state saved by save_warnings_state() """ warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2) warnings.filters = self._warnings_state[:]
def run(
self, result=None)
def run(self, result=None): orig_result = result if result is None: result = self.defaultTestResult() startTestRun = getattr(result, 'startTestRun', None) if startTestRun is not None: startTestRun() self._resultForDoCleanups = result result.startTest(self) testMethod = getattr(self, self._testMethodName) if (getattr(self.__class__, "__unittest_skip__", False) or getattr(testMethod, "__unittest_skip__", False)): # If the class or method was skipped. try: skip_why = (getattr(self.__class__, '__unittest_skip_why__', '') or getattr(testMethod, '__unittest_skip_why__', '')) self._addSkip(result, skip_why) finally: result.stopTest(self) return try: success = False try: self.setUp() except SkipTest as e: self._addSkip(result, str(e)) except KeyboardInterrupt: raise except: result.addError(self, sys.exc_info()) else: try: testMethod() except KeyboardInterrupt: raise except self.failureException: result.addFailure(self, sys.exc_info()) except _ExpectedFailure as e: addExpectedFailure = getattr(result, 'addExpectedFailure', None) if addExpectedFailure is not None: addExpectedFailure(self, e.exc_info) else: warnings.warn("TestResult has no addExpectedFailure method, reporting as passes", RuntimeWarning) result.addSuccess(self) except _UnexpectedSuccess: addUnexpectedSuccess = getattr(result, 'addUnexpectedSuccess', None) if addUnexpectedSuccess is not None: addUnexpectedSuccess(self) else: warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failures", RuntimeWarning) result.addFailure(self, sys.exc_info()) except SkipTest as e: self._addSkip(result, str(e)) except: result.addError(self, sys.exc_info()) else: success = True try: self.tearDown() except KeyboardInterrupt: raise except: result.addError(self, sys.exc_info()) success = False cleanUpSuccess = self.doCleanups() success = success and cleanUpSuccess if success: result.addSuccess(self) finally: result.stopTest(self) if orig_result is None: stopTestRun = getattr(result, 'stopTestRun', None) if stopTestRun is not None: stopTestRun()
def save_warnings_state(
self)
Saves the state of the warnings module
def save_warnings_state(self): """ Saves the state of the warnings module """ warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2) self._warnings_state = warnings.filters[:]
def setUp(
self)
Create a test database based on objects created in Django
def setUp(self): "Create a test database based on objects created in Django" self.user_david = User.objects.create_user(username="david") self.user_olivier = User.objects.create_user(username="olivier") self.country = LocationType.objects.create(code="country", name="Country") self.continent = LocationType.objects.create(code="continent", name="Continent") self.city = LocationType.objects.create(code="city", name="City") self.paris = Location.objects.create(name="Paris", type=Location.OTHER_TYPE, complete_type=self.city) self.france = Location.objects.create(name="France", type=Location.COUNTRY, complete_type=self.country) self.europe = Location.objects.create(name="Europe", type=Location.CONTINENT, complete_type=self.continent) self.belgique = Location.objects.create(name="Belgique", type=Location.COUNTRY, complete_type=self.country) self.europe.add_child(self.france) self.france.add_child(self.paris) self.europe.add_child(self.belgique) self.a = EthnicGroup.objects.create(value="a") self.b = EthnicGroup.objects.create(value="b") self.c = EthnicGroup.objects.create(value="c") self.d = EthnicGroup.objects.create(value="d") self.collection_persepolis = MediaCollection(id=1, code="CNRSMH_E_1970_001_002", reference="A1", title="Persepolis", creator="Abraham LINCOLN", collector="Friedrich HEINZ", year_published=2009, is_published=True, recorded_from_year=1970, recorded_to_year=1980) self.collection_persepolis.set_revision(self.user_david) self.collection_persepolis.save() self.collection_volonte = MediaCollection(id=2, reference="A2", code="CNRSMH_I_1960_001", title="Volonté de puissance", creator="Friedrich NIETZSCHE", collector="Jean AMORA", year_published=1999, recorded_from_year=1960, recorded_to_year=2000) self.collection_volonte.set_revision(self.user_olivier) self.collection_volonte.save() self.collection_nicolas = MediaCollection(id=3, reference="A3", code="CNRSMH_I_1967_123", title="Petit nicolas", creator="Georgette McKenic", collector="Paul MAILLE", year_published=1999, recorded_from_year=1967, recorded_to_year=1968) self.collection_nicolas.set_revision(self.user_olivier) self.collection_nicolas.save() self.item_1 = MediaItem(id=1, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_44", recorded_from_date="1971-01-12", recorded_to_date="1971-02-24", location=self.paris, ethnic_group=self.a, title="item 1", author="Mickael SHEPHERD", collector="Charles PREMIER", comment="comment 1") self.item_1.set_revision(self.user_david) self.item_2 = MediaItem(id=2, collection=self.collection_volonte, code="CNRSMH_I_1960_001_129", recorded_from_date="1981-01-12", recorded_to_date="1991-02-24", location=self.france, ethnic_group=self.a, title="item 2", author="Rick ROLL", comment="comment 2") self.item_2.set_revision(self.user_david) self.item_3 = MediaItem(id=3, collection=self.collection_nicolas, code="CNRSMH_I_1967_123_456_01", recorded_from_date="1968-01-12", recorded_to_date="1968-02-24", location=self.belgique, ethnic_group=self.b, title="item 3", author="John SMITH", collector="Paul CARLOS", comment="comment 3", ) self.item_3.set_revision(self.user_olivier) self.item_4 = MediaItem(id=4, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_22_33", recorded_from_date="1972-01-12", recorded_to_date="1972-02-24", location=self.europe, ethnic_group=self.a, title="item 4", alt_title="I4", author="Keanu REAVES", collector="Christina BARCELONA", comment="comment 4") self.item_4.set_revision(self.user_olivier) self.item_5 = MediaItem(id=5, collection=self.collection_volonte,code="CNRSMH_I_1960_001_789_85_22", approx_duration="00:05:00", recorded_from_date="1978-01-12", recorded_to_date="1978-02-24", location=self.belgique, ethnic_group=self.a, title="item 5", alt_title="I5", author="Simon PAUL", collector="Javier BARDEM", comment="comment 5") self.item_5.set_revision(self.user_olivier) self.item_6 = MediaItem(id=6, collection=self.collection_persepolis, code="CNRSMH_E_1970_001_002_90", recorded_from_date="1968-01-12", recorded_to_date="1968-02-11", location=self.france, ethnic_group=self.b, title="item 6", author="Paul ANDERSON", collector="Jim CARLSON", comment="comment 10000") self.item_6.set_revision(self.user_david) self.item_1.save() self.item_2.save() self.item_3.save() self.item_4.save() self.item_5.save() self.item_6.save() self.collections = MediaCollection.objects.all() self.items = MediaItem.objects.all()
def setUpClass(
cls)
Hook method for setting up class fixture before running tests in the class.
@classmethod def setUpClass(cls): "Hook method for setting up class fixture before running tests in the class."
def settings(
self, **kwargs)
A context manager that temporarily sets a setting and reverts back to the original value when exiting the context.
def settings(self, **kwargs): """ A context manager that temporarily sets a setting and reverts back to the original value when exiting the context. """ return override_settings(**kwargs)
def shortDescription(
self)
Returns a one-line description of the test, or None if no description has been provided.
The default implementation of this method returns the first line of the specified test method's docstring.
def shortDescription(self): """Returns a one-line description of the test, or None if no description has been provided. The default implementation of this method returns the first line of the specified test method's docstring. """ doc = self._testMethodDoc return doc and doc.split("\n")[0].strip() or None
def skipTest(
self, reason)
Skip this test.
def skipTest(self, reason): """Skip this test.""" raise SkipTest(reason)
def tearDown(
self)
def tearDown(self): User.objects.all().delete() LocationType.objects.all().delete() Location.objects.all().delete() EthnicGroup.objects.all().delete() MediaCollection.objects.all().delete() MediaItem.objects.all().delete()
def tearDownClass(
cls)
Hook method for deconstructing the class fixture after running all tests in the class.
@classmethod def tearDownClass(cls): "Hook method for deconstructing the class fixture after running all tests in the class."
def testByChangeTimeOnCollection(
self)
Test by_change_time property of MediaCollection class
@pytest.mark.skip(reason="This test has to be reviewed") def testByChangeTimeOnCollection(self): "Test by_change_time property of MediaCollection class" now = datetime.now() print MediaCollection.objects.all() result = self.collections.by_change_time(now - timedelta(hours=1), now).order_by("title") self.assertEquals(result[0], self.collection_persepolis)
def testByChangeTimeOnItem(
self)
Test by_change_time property of MediaItem class
@pytest.mark.skip(reason="This test has to be reviewed") def testByChangeTimeOnItem(self): "Test by_change_time property of MediaItem class" now = datetime.now() result = self.items.by_change_time(now - timedelta(hours=1), now).order_by("title") self.assertEquals(result[0], self.item_1)
def testCodeRequired(
self)
Test that a proper failure occur when a collection code isn't provided
def testCodeRequired(self): "Test that a proper failure occur when a collection code isn't provided" c = MediaCollection(title='test') try: c.save() #c.set_revision(self.user_olivier) except RequiredFieldError, e: self.assertEquals(e.field.name, 'code') else: self.fail("No exception raised")
def testCollectionCountries(
self)
Test the MediaCollection.countries() method
def testCollectionCountries(self): "Test the MediaCollection.countries() method" self.assertEquals(self.collection_volonte.countries(), [self.belgique, self.france])
def testDomForeignKey(
self)
Test DOM foreign key embedding
def testDomForeignKey(self): "Test DOM foreign key embedding" doc = self.item_4.to_dom() self.assertEquals(doc.getElementsByTagName('collection')[0].getAttribute('key'), str(self.collection_persepolis.id))
def testEthnicGroup(
self)
Test by_ethnic_group property of MediaCollection class
def testEthnicGroup(self): "Test by_ethnic_group property of MediaCollection class" result=self.collections.by_ethnic_group(self.a).order_by("title") self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(result[1], self.collection_volonte)
def testLocationRelation(
self)
Test location country and continent resolving
def testLocationRelation(self): "Test location country and continent resolving" self.assertEquals(self.france, self.item_1.location.countries()[0]) self.assertEquals(self.europe, self.item_1.location.continents()[0]) self.assertEquals(self.france, self.item_2.location.countries()[0]) self.assertEquals(self.europe, self.item_2.location.continents()[0])
def testLocationSearch(
self)
Test by_country and by_continent properties of MediaCollection class
def testLocationSearch(self): "Test by_country and by_continent properties of MediaCollection class" self.assertEquals(self.collections.by_location(self.france)[0], self.collection_persepolis) self.assertEquals(self.collections.by_location(self.europe)[0], self.collection_persepolis) self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[0], self.collection_nicolas) self.assertEquals(self.collections.by_location(self.belgique).order_by("title")[1], self.collection_volonte)
def testPublishYearOnCollection(
self)
Test by_publish_year property of MediaCollection class
def testPublishYearOnCollection(self): "Test by_publish_year property of MediaCollection class" result=self.collections.by_publish_year(1999).order_by('title') self.assertEquals(result[0], self.collection_nicolas) self.assertEquals(result[1], self.collection_volonte)
def testPublishYearOnItem(
self)
Test by_publish_year property of MediaItem class
def testPublishYearOnItem(self): "Test by_publish_year property of MediaItem class" result = self.items.by_publish_year(1999).order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_3) self.assertEquals(result[2], self.item_5)
def testQuickSearchOnCollections(
self)
Test quick_search property of MediaCollection class
def testQuickSearchOnCollections(self): "Test quick_search property of MediaCollection class" self.assertEquals(len(self.collections), 3) result = self.collections.quick_search("persepolis") self.assertEquals(len(result), 1) self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(self.collections.quick_search("nietzsche")[0], self.collection_volonte) result = self.collections.quick_search("nicolas") self.assertEquals(result[0], self.collection_nicolas)
def testQuickSearchOnItems(
self)
Test quick_search property of MediaItem class
def testQuickSearchOnItems(self): "Test quick_search property of MediaItem class" result = self.items.quick_search("item").order_by('title') self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6)
def testRecordingDate(
self)
Test by_recording_date property of MediaItem class
def testRecordingDate(self): "Test by_recording_date property of MediaItem class" result = self.items.by_recording_date("1968-01-01", "1972-12-12").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_3) self.assertEquals(result[2], self.item_4) self.assertEquals(result[3], self.item_6) result = self.items.by_recording_date("1968-02-06").order_by("title") self.assertEquals(result[0], self.item_3) self.assertEquals(result[1], self.item_6)
def testRecordingYear(
self)
Test by_recording_year property of MediaCollection class
def testRecordingYear(self): "Test by_recording_year property of MediaCollection class" self.assertEquals(self.collections.by_recording_year(1970, 1980)[0], self.collection_persepolis) result = self.collections.by_recording_year(1975).order_by("title") self.assertEquals(result[0], self.collection_persepolis) self.assertEquals(result[1], self.collection_volonte)
def testTitle(
self)
Test by_title property of MediaItem class
def testTitle(self): "Test by_title property of MediaItem class" result = self.items.by_title("item").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6) self.item_2.title = '' self.item_2.save() self.item_5.title = '' self.item_5.save() result = self.items.by_title("volonté").order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_5) result = self.items.by_title("puissance volonté").order_by("title") self.assertEquals(result[0], self.item_2) self.assertEquals(result[1], self.item_5)
def testWithoutCollection(
self)
Test without_collection property of MediaItem class
def testWithoutCollection(self): "Test without_collection property of MediaItem class" self.assertEquals(self.items.without_collection().count(), 0)
def testWordSearch(
self)
Test quick_search property of MediaCollection class, specificly quick_search on collection title
def testWordSearch(self): "Test quick_search property of MediaCollection class, specificly quick_search on collection title" result = self.collections.quick_search("volonté puissance") self.assertEquals(result[0], self.collection_volonte) result = self.collections.quick_search("puissance volonté") self.assertEquals(result[0], self.collection_volonte)
def testWordSearchCore(
self)
Test word_search property of CoreQuerySet class
def testWordSearchCore(self): "Test word_search property of CoreQuerySet class" self.assertEquals(self.collections.word_search("title", "volonté")[0], self.collection_volonte) self.assertEquals(self.collections.word_search("code", "CNRSMH_E_1970_001_002")[0], self.collection_persepolis) self.assertEquals(self.items.word_search("code", "CNRSMH_E_1970_001_002_44")[0], self.item_1) result = self.items.word_search("comment", "comment").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) self.assertEquals(result[2], self.item_3) self.assertEquals(result[3], self.item_4) self.assertEquals(result[4], self.item_5) self.assertEquals(result[5], self.item_6)
class RelatedDeleteTestCase
class RelatedDeleteTestCase(TestCase): def setUp(self): self.publisher1 = Publisher.objects.create(id=1, value='publisher1') self.publisher2 = Publisher.objects.create(id=2, value='publisher2') self.pubcollection1 = PublisherCollection.objects.create(publisher=self.publisher1, value='pub1_collection1') self.rights1 = LegalRight.objects.create(id=1, value='right1') MediaCollection.objects.create(id=1, code='CNRSMH_I_1256_456', title='Collection1', publisher=self.publisher1, publisher_collection=self.pubcollection1, legal_rights=self.rights1) MediaCollection.objects.create(id=2, code='CNRSMH_I_1256_123', title='Collection2', publisher=self.publisher2) def tearDown(self): Publisher.objects.all().delete() PublisherCollection.objects.all().delete() LegalRight.objects.all().delete() MediaCollection.objects.all().delete() def testOnDeleteSetNull(self): self.rights1.delete() self.assertEquals(LegalRight.objects.filter(id=1).count(), 0) q = MediaCollection.objects.filter(id=1) self.assertEquals(q.count(), 1) self.assertEquals(q[0].legal_rights, None) def testOnDeleteCascade(self): self.publisher1.delete() self.assertEquals(Publisher.objects.filter(id=1).count(), 0) self.assertEquals(Publisher.objects.filter(id=2).count(), 1) self.assertEquals(PublisherCollection.objects.filter(id=1).count(), 0) q = MediaCollection.objects.filter(id=1) self.assertEquals(q.count(), 1) self.assertEquals(q[0].publisher, None) self.assertEquals(q[0].publisher_collection, None) q = MediaCollection.objects.filter(id=2) self.assertEquals(q.count(), 1) self.assertEquals(q[0].publisher, self.publisher2) self.assertEquals(q[0].publisher_collection, None) def testOnDeleteMultiple(self): Publisher.objects.all().delete() self.assertEquals(Publisher.objects.count(), 0) self.assertEquals(PublisherCollection.objects.count(), 0) self.assertEquals(MediaCollection.objects.count(), 2)
Ancestors (in MRO)
- RelatedDeleteTestCase
- django.test.testcases.TestCase
- django.test.testcases.TransactionTestCase
- django.test.testcases.SimpleTestCase
- unittest.case.TestCase
- __builtin__.object
Class variables
var available_apps
var client_class
var failureException
var longMessage
var maxDiff
var reset_sequences
Methods
def __init__(
self, methodName='runTest')
Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name.
def __init__(self, methodName='runTest'): """Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name. """ self._testMethodName = methodName self._resultForDoCleanups = None try: testMethod = getattr(self, methodName) except AttributeError: raise ValueError("no such test method in %s: %s" % (self.__class__, methodName)) self._testMethodDoc = testMethod.__doc__ self._cleanups = [] # Map types to custom assertEqual functions that will compare # instances of said type in more detail to generate a more useful # error message. self._type_equality_funcs = {} self.addTypeEqualityFunc(dict, 'assertDictEqual') self.addTypeEqualityFunc(list, 'assertListEqual') self.addTypeEqualityFunc(tuple, 'assertTupleEqual') self.addTypeEqualityFunc(set, 'assertSetEqual') self.addTypeEqualityFunc(frozenset, 'assertSetEqual') try: self.addTypeEqualityFunc(unicode, 'assertMultiLineEqual') except NameError: # No unicode support in this build pass
def addCleanup(
self, function, *args, **kwargs)
Add a function, with arguments, to be called when the test is completed. Functions added are called on a LIFO basis and are called after tearDown on test failure or success.
Cleanup items are called even if setUp fails (unlike tearDown).
def addCleanup(self, function, *args, **kwargs): """Add a function, with arguments, to be called when the test is completed. Functions added are called on a LIFO basis and are called after tearDown on test failure or success. Cleanup items are called even if setUp fails (unlike tearDown).""" self._cleanups.append((function, args, kwargs))
def addTypeEqualityFunc(
self, typeobj, function)
Add a type specific assertEqual style function to compare a type.
This method is for use by TestCase subclasses that need to register their own type equality functions to provide nicer error messages.
Args: typeobj: The data type to call this function on when both values are of the same type in assertEqual(). function: The callable taking two arguments and an optional msg= argument that raises self.failureException with a useful error message when the two arguments are not equal.
def addTypeEqualityFunc(self, typeobj, function): """Add a type specific assertEqual style function to compare a type. This method is for use by TestCase subclasses that need to register their own type equality functions to provide nicer error messages. Args: typeobj: The data type to call this function on when both values are of the same type in assertEqual(). function: The callable taking two arguments and an optional msg= argument that raises self.failureException with a useful error message when the two arguments are not equal. """ self._type_equality_funcs[typeobj] = function
def assertAlmostEqual(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
If the two objects compare equal then they will automatically compare almost equal.
def assertAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). If the two objects compare equal then they will automatically compare almost equal. """ if first == second: # shortcut return if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if abs(first - second) <= delta: return standardMsg = '%s != %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if round(abs(second-first), places) == 0: return standardMsg = '%s != %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertAlmostEquals(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
If the two objects compare equal then they will automatically compare almost equal.
def assertAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is more than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). If the two objects compare equal then they will automatically compare almost equal. """ if first == second: # shortcut return if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if abs(first - second) <= delta: return standardMsg = '%s != %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if round(abs(second-first), places) == 0: return standardMsg = '%s != %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertContains(
self, response, text, count=None, status_code=200, msg_prefix=u'', html=False)
Asserts that a response indicates that some content was retrieved
successfully, (i.e., the HTTP status code was as expected), and that
text
occurs count
times in the content of the response.
If count
is None, the count doesn't matter - the assertion is true
if the text occurs at least once in the response.
def assertContains(self, response, text, count=None, status_code=200, msg_prefix='', html=False): """ Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that ``text`` occurs ``count`` times in the content of the response. If ``count`` is None, the count doesn't matter - the assertion is true if the text occurs at least once in the response. """ # If the response supports deferred rendering and hasn't been rendered # yet, then ensure that it does get rendered before proceeding further. if (hasattr(response, 'render') and callable(response.render) and not response.is_rendered): response.render() if msg_prefix: msg_prefix += ": " self.assertEqual(response.status_code, status_code, msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) if response.streaming: content = b''.join(response.streaming_content) else: content = response.content if not isinstance(text, bytes) or html: text = force_text(text, encoding=response._charset) content = content.decode(response._charset) text_repr = "'%s'" % text else: text_repr = repr(text) if html: content = assert_and_parse_html(self, content, None, "Response's content is not valid HTML:") text = assert_and_parse_html(self, text, None, "Second argument is not valid HTML:") real_count = content.count(text) if count is not None: self.assertEqual(real_count, count, msg_prefix + "Found %d instances of %s in response" " (expected %d)" % (real_count, text_repr, count)) else: self.assertTrue(real_count != 0, msg_prefix + "Couldn't find %s in response" % text_repr)
def assertDictContainsSubset(
self, expected, actual, msg=None)
Checks whether actual is a superset of expected.
def assertDictContainsSubset(self, expected, actual, msg=None): """Checks whether actual is a superset of expected.""" missing = [] mismatched = [] for key, value in expected.iteritems(): if key not in actual: missing.append(key) elif value != actual[key]: mismatched.append('%s, expected: %s, actual: %s' % (safe_repr(key), safe_repr(value), safe_repr(actual[key]))) if not (missing or mismatched): return standardMsg = '' if missing: standardMsg = 'Missing: %s' % ','.join(safe_repr(m) for m in missing) if mismatched: if standardMsg: standardMsg += '; ' standardMsg += 'Mismatched values: %s' % ','.join(mismatched) self.fail(self._formatMessage(msg, standardMsg))
def assertDictEqual(
self, d1, d2, msg=None)
def assertDictEqual(self, d1, d2, msg=None): self.assertIsInstance(d1, dict, 'First argument is not a dictionary') self.assertIsInstance(d2, dict, 'Second argument is not a dictionary') if d1 != d2: standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True)) diff = ('\n' + '\n'.join(difflib.ndiff( pprint.pformat(d1).splitlines(), pprint.pformat(d2).splitlines()))) standardMsg = self._truncateMessage(standardMsg, diff) self.fail(self._formatMessage(msg, standardMsg))
def assertEqual(
self, first, second, msg=None)
Fail if the two objects are unequal as determined by the '==' operator.
def assertEqual(self, first, second, msg=None): """Fail if the two objects are unequal as determined by the '==' operator. """ assertion_func = self._getAssertEqualityFunc(first, second) assertion_func(first, second, msg=msg)
def assertEquals(
self, first, second, msg=None)
Fail if the two objects are unequal as determined by the '==' operator.
def assertEqual(self, first, second, msg=None): """Fail if the two objects are unequal as determined by the '==' operator. """ assertion_func = self._getAssertEqualityFunc(first, second) assertion_func(first, second, msg=msg)
def assertFalse(
self, expr, msg=None)
Check that the expression is false.
def assertFalse(self, expr, msg=None): """Check that the expression is false.""" if expr: msg = self._formatMessage(msg, "%s is not false" % safe_repr(expr)) raise self.failureException(msg)
def assertFieldOutput(
self, fieldclass, valid, invalid, field_args=None, field_kwargs=None, empty_value=u'')
Asserts that a form field behaves correctly with various inputs.
Args: fieldclass: the class of the field to be tested. valid: a dictionary mapping valid inputs to their expected cleaned values. invalid: a dictionary mapping invalid inputs to one or more raised error messages. field_args: the args passed to instantiate the field field_kwargs: the kwargs passed to instantiate the field empty_value: the expected clean output for inputs in empty_values
def assertFieldOutput(self, fieldclass, valid, invalid, field_args=None, field_kwargs=None, empty_value=''): """ Asserts that a form field behaves correctly with various inputs. Args: fieldclass: the class of the field to be tested. valid: a dictionary mapping valid inputs to their expected cleaned values. invalid: a dictionary mapping invalid inputs to one or more raised error messages. field_args: the args passed to instantiate the field field_kwargs: the kwargs passed to instantiate the field empty_value: the expected clean output for inputs in empty_values """ if field_args is None: field_args = [] if field_kwargs is None: field_kwargs = {} required = fieldclass(*field_args, **field_kwargs) optional = fieldclass(*field_args, **dict(field_kwargs, required=False)) # test valid inputs for input, output in valid.items(): self.assertEqual(required.clean(input), output) self.assertEqual(optional.clean(input), output) # test invalid inputs for input, errors in invalid.items(): with self.assertRaises(ValidationError) as context_manager: required.clean(input) self.assertEqual(context_manager.exception.messages, errors) with self.assertRaises(ValidationError) as context_manager: optional.clean(input) self.assertEqual(context_manager.exception.messages, errors) # test required inputs error_required = [force_text(required.error_messages['required'])] for e in required.empty_values: with self.assertRaises(ValidationError) as context_manager: required.clean(e) self.assertEqual(context_manager.exception.messages, error_required) self.assertEqual(optional.clean(e), empty_value) # test that max_length and min_length are always accepted if issubclass(fieldclass, CharField): field_kwargs.update({'min_length':2, 'max_length':20}) self.assertTrue(isinstance(fieldclass(*field_args, **field_kwargs), fieldclass))
def assertFormError(
self, response, form, field, errors, msg_prefix=u'')
Asserts that a form used to render the response has a specific field error.
def assertFormError(self, response, form, field, errors, msg_prefix=''): """ Asserts that a form used to render the response has a specific field error. """ if msg_prefix: msg_prefix += ": " # Put context(s) into a list to simplify processing. contexts = to_list(response.context) if not contexts: self.fail(msg_prefix + "Response did not use any contexts to " "render the response") # Put error(s) into a list to simplify processing. errors = to_list(errors) # Search all contexts for the error. found_form = False for i,context in enumerate(contexts): if form not in context: continue found_form = True for err in errors: if field: if field in context[form].errors: field_errors = context[form].errors[field] self.assertTrue(err in field_errors, msg_prefix + "The field '%s' on form '%s' in" " context %d does not contain the error '%s'" " (actual errors: %s)" % (field, form, i, err, repr(field_errors))) elif field in context[form].fields: self.fail(msg_prefix + "The field '%s' on form '%s'" " in context %d contains no errors" % (field, form, i)) else: self.fail(msg_prefix + "The form '%s' in context %d" " does not contain the field '%s'" % (form, i, field)) else: non_field_errors = context[form].non_field_errors() self.assertTrue(err in non_field_errors, msg_prefix + "The form '%s' in context %d does not" " contain the non-field error '%s'" " (actual errors: %s)" % (form, i, err, non_field_errors)) if not found_form: self.fail(msg_prefix + "The form '%s' was not used to render the" " response" % form)
def assertFormsetError(
self, response, formset, form_index, field, errors, msg_prefix=u'')
Asserts that a formset used to render the response has a specific error.
For field errors, specify the form_index
and the field
.
For non-field errors, specify the form_index
and the field
as
None.
For non-form errors, specify form_index
as None and the field
as None.
def assertFormsetError(self, response, formset, form_index, field, errors, msg_prefix=''): """ Asserts that a formset used to render the response has a specific error. For field errors, specify the ``form_index`` and the ``field``. For non-field errors, specify the ``form_index`` and the ``field`` as None. For non-form errors, specify ``form_index`` as None and the ``field`` as None. """ # Add punctuation to msg_prefix if msg_prefix: msg_prefix += ": " # Put context(s) into a list to simplify processing. contexts = to_list(response.context) if not contexts: self.fail(msg_prefix + 'Response did not use any contexts to ' 'render the response') # Put error(s) into a list to simplify processing. errors = to_list(errors) # Search all contexts for the error. found_formset = False for i, context in enumerate(contexts): if formset not in context: continue found_formset = True for err in errors: if field is not None: if field in context[formset].forms[form_index].errors: field_errors = context[formset].forms[form_index].errors[field] self.assertTrue(err in field_errors, msg_prefix + "The field '%s' on formset '%s', " "form %d in context %d does not contain the " "error '%s' (actual errors: %s)" % (field, formset, form_index, i, err, repr(field_errors))) elif field in context[formset].forms[form_index].fields: self.fail(msg_prefix + "The field '%s' " "on formset '%s', form %d in " "context %d contains no errors" % (field, formset, form_index, i)) else: self.fail(msg_prefix + "The formset '%s', form %d in " "context %d does not contain the field '%s'" % (formset, form_index, i, field)) elif form_index is not None: non_field_errors = context[formset].forms[form_index].non_field_errors() self.assertFalse(len(non_field_errors) == 0, msg_prefix + "The formset '%s', form %d in " "context %d does not contain any non-field " "errors." % (formset, form_index, i)) self.assertTrue(err in non_field_errors, msg_prefix + "The formset '%s', form %d " "in context %d does not contain the " "non-field error '%s' " "(actual errors: %s)" % (formset, form_index, i, err, repr(non_field_errors))) else: non_form_errors = context[formset].non_form_errors() self.assertFalse(len(non_form_errors) == 0, msg_prefix + "The formset '%s' in " "context %d does not contain any " "non-form errors." % (formset, i)) self.assertTrue(err in non_form_errors, msg_prefix + "The formset '%s' in context " "%d does not contain the " "non-form error '%s' (actual errors: %s)" % (formset, i, err, repr(non_form_errors))) if not found_formset: self.fail(msg_prefix + "The formset '%s' was not used to render " "the response" % formset)
def assertGreater(
self, a, b, msg=None)
Just like self.assertTrue(a > b), but with a nicer default message.
def assertGreater(self, a, b, msg=None): """Just like self.assertTrue(a > b), but with a nicer default message.""" if not a > b: standardMsg = '%s not greater than %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertGreaterEqual(
self, a, b, msg=None)
Just like self.assertTrue(a >= b), but with a nicer default message.
def assertGreaterEqual(self, a, b, msg=None): """Just like self.assertTrue(a >= b), but with a nicer default message.""" if not a >= b: standardMsg = '%s not greater than or equal to %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertHTMLEqual(
self, html1, html2, msg=None)
Asserts that two HTML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid HTML.
def assertHTMLEqual(self, html1, html2, msg=None): """ Asserts that two HTML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid HTML. """ dom1 = assert_and_parse_html(self, html1, msg, 'First argument is not valid HTML:') dom2 = assert_and_parse_html(self, html2, msg, 'Second argument is not valid HTML:') if dom1 != dom2: standardMsg = '%s != %s' % ( safe_repr(dom1, True), safe_repr(dom2, True)) diff = ('\n' + '\n'.join(difflib.ndiff( six.text_type(dom1).splitlines(), six.text_type(dom2).splitlines()))) standardMsg = self._truncateMessage(standardMsg, diff) self.fail(self._formatMessage(msg, standardMsg))
def assertHTMLNotEqual(
self, html1, html2, msg=None)
Asserts that two HTML snippets are not semantically equivalent.
def assertHTMLNotEqual(self, html1, html2, msg=None): """Asserts that two HTML snippets are not semantically equivalent.""" dom1 = assert_and_parse_html(self, html1, msg, 'First argument is not valid HTML:') dom2 = assert_and_parse_html(self, html2, msg, 'Second argument is not valid HTML:') if dom1 == dom2: standardMsg = '%s == %s' % ( safe_repr(dom1, True), safe_repr(dom2, True)) self.fail(self._formatMessage(msg, standardMsg))
def assertIn(
self, member, container, msg=None)
Just like self.assertTrue(a in b), but with a nicer default message.
def assertIn(self, member, container, msg=None): """Just like self.assertTrue(a in b), but with a nicer default message.""" if member not in container: standardMsg = '%s not found in %s' % (safe_repr(member), safe_repr(container)) self.fail(self._formatMessage(msg, standardMsg))
def assertInHTML(
self, needle, haystack, count=None, msg_prefix=u'')
def assertInHTML(self, needle, haystack, count=None, msg_prefix=''): needle = assert_and_parse_html(self, needle, None, 'First argument is not valid HTML:') haystack = assert_and_parse_html(self, haystack, None, 'Second argument is not valid HTML:') real_count = haystack.count(needle) if count is not None: self.assertEqual(real_count, count, msg_prefix + "Found %d instances of '%s' in response" " (expected %d)" % (real_count, needle, count)) else: self.assertTrue(real_count != 0, msg_prefix + "Couldn't find '%s' in response" % needle)
def assertIs(
self, expr1, expr2, msg=None)
Just like self.assertTrue(a is b), but with a nicer default message.
def assertIs(self, expr1, expr2, msg=None): """Just like self.assertTrue(a is b), but with a nicer default message.""" if expr1 is not expr2: standardMsg = '%s is not %s' % (safe_repr(expr1), safe_repr(expr2)) self.fail(self._formatMessage(msg, standardMsg))
def assertIsInstance(
self, obj, cls, msg=None)
Same as self.assertTrue(isinstance(obj, cls)), with a nicer default message.
def assertIsInstance(self, obj, cls, msg=None): """Same as self.assertTrue(isinstance(obj, cls)), with a nicer default message.""" if not isinstance(obj, cls): standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls) self.fail(self._formatMessage(msg, standardMsg))
def assertIsNone(
self, obj, msg=None)
Same as self.assertTrue(obj is None), with a nicer default message.
def assertIsNone(self, obj, msg=None): """Same as self.assertTrue(obj is None), with a nicer default message.""" if obj is not None: standardMsg = '%s is not None' % (safe_repr(obj),) self.fail(self._formatMessage(msg, standardMsg))
def assertIsNot(
self, expr1, expr2, msg=None)
Just like self.assertTrue(a is not b), but with a nicer default message.
def assertIsNot(self, expr1, expr2, msg=None): """Just like self.assertTrue(a is not b), but with a nicer default message.""" if expr1 is expr2: standardMsg = 'unexpectedly identical: %s' % (safe_repr(expr1),) self.fail(self._formatMessage(msg, standardMsg))
def assertIsNotNone(
self, obj, msg=None)
Included for symmetry with assertIsNone.
def assertIsNotNone(self, obj, msg=None): """Included for symmetry with assertIsNone.""" if obj is None: standardMsg = 'unexpectedly None' self.fail(self._formatMessage(msg, standardMsg))
def assertItemsEqual(
self, expected_seq, actual_seq, msg=None)
An unordered sequence specific comparison. It asserts that actual_seq and expected_seq have the same element counts. Equivalent to::
self.assertEqual(Counter(iter(actual_seq)), Counter(iter(expected_seq)))
Asserts that each element has the same count in both sequences. Example: - [0, 1, 1] and [1, 0, 1] compare equal. - [0, 0, 1] and [0, 1] compare unequal.
def assertItemsEqual(self, expected_seq, actual_seq, msg=None): """An unordered sequence specific comparison. It asserts that actual_seq and expected_seq have the same element counts. Equivalent to:: self.assertEqual(Counter(iter(actual_seq)), Counter(iter(expected_seq))) Asserts that each element has the same count in both sequences. Example: - [0, 1, 1] and [1, 0, 1] compare equal. - [0, 0, 1] and [0, 1] compare unequal. """ first_seq, second_seq = list(expected_seq), list(actual_seq) with warnings.catch_warnings(): if sys.py3kwarning: # Silence Py3k warning raised during the sorting for _msg in ["(code|dict|type) inequality comparisons", "builtin_function_or_method order comparisons", "comparing unequal types"]: warnings.filterwarnings("ignore", _msg, DeprecationWarning) try: first = collections.Counter(first_seq) second = collections.Counter(second_seq) except TypeError: # Handle case with unhashable elements differences = _count_diff_all_purpose(first_seq, second_seq) else: if first == second: return differences = _count_diff_hashable(first_seq, second_seq) if differences: standardMsg = 'Element counts were not equal:\n' lines = ['First has %d, Second has %d: %r' % diff for diff in differences] diffMsg = '\n'.join(lines) standardMsg = self._truncateMessage(standardMsg, diffMsg) msg = self._formatMessage(msg, standardMsg) self.fail(msg)
def assertJSONEqual(
self, raw, expected_data, msg=None)
def assertJSONEqual(self, raw, expected_data, msg=None): try: data = json.loads(raw) except ValueError: self.fail("First argument is not valid JSON: %r" % raw) if isinstance(expected_data, six.string_types): try: expected_data = json.loads(expected_data) except ValueError: self.fail("Second argument is not valid JSON: %r" % expected_data) self.assertEqual(data, expected_data, msg=msg)
def assertLess(
self, a, b, msg=None)
Just like self.assertTrue(a < b), but with a nicer default message.
def assertLess(self, a, b, msg=None): """Just like self.assertTrue(a < b), but with a nicer default message.""" if not a < b: standardMsg = '%s not less than %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertLessEqual(
self, a, b, msg=None)
Just like self.assertTrue(a <= b), but with a nicer default message.
def assertLessEqual(self, a, b, msg=None): """Just like self.assertTrue(a <= b), but with a nicer default message.""" if not a <= b: standardMsg = '%s not less than or equal to %s' % (safe_repr(a), safe_repr(b)) self.fail(self._formatMessage(msg, standardMsg))
def assertListEqual(
self, list1, list2, msg=None)
A list-specific equality assertion.
Args: list1: The first list to compare. list2: The second list to compare. msg: Optional message to use on failure instead of a list of differences.
def assertListEqual(self, list1, list2, msg=None): """A list-specific equality assertion. Args: list1: The first list to compare. list2: The second list to compare. msg: Optional message to use on failure instead of a list of differences. """ self.assertSequenceEqual(list1, list2, msg, seq_type=list)
def assertMultiLineEqual(
self, first, second, msg=None)
Assert that two multi-line strings are equal.
def assertMultiLineEqual(self, first, second, msg=None): """Assert that two multi-line strings are equal.""" self.assertIsInstance(first, basestring, 'First argument is not a string') self.assertIsInstance(second, basestring, 'Second argument is not a string') if first != second: # don't use difflib if the strings are too long if (len(first) > self._diffThreshold or len(second) > self._diffThreshold): self._baseAssertEqual(first, second, msg) firstlines = first.splitlines(True) secondlines = second.splitlines(True) if len(firstlines) == 1 and first.strip('\r\n') == first: firstlines = [first + '\n'] secondlines = [second + '\n'] standardMsg = '%s != %s' % (safe_repr(first, True), safe_repr(second, True)) diff = '\n' + ''.join(difflib.ndiff(firstlines, secondlines)) standardMsg = self._truncateMessage(standardMsg, diff) self.fail(self._formatMessage(msg, standardMsg))
def assertNotAlmostEqual(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
Objects that are equal automatically fail.
def assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). Objects that are equal automatically fail. """ if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if not (first == second) and abs(first - second) > delta: return standardMsg = '%s == %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if not (first == second) and round(abs(second-first), places) != 0: return standardMsg = '%s == %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertNotAlmostEquals(
self, first, second, places=None, msg=None, delta=None)
Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta.
Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit).
Objects that are equal automatically fail.
def assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None): """Fail if the two objects are equal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the between the two objects is less than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). Objects that are equal automatically fail. """ if delta is not None and places is not None: raise TypeError("specify delta or places not both") if delta is not None: if not (first == second) and abs(first - second) > delta: return standardMsg = '%s == %s within %s delta' % (safe_repr(first), safe_repr(second), safe_repr(delta)) else: if places is None: places = 7 if not (first == second) and round(abs(second-first), places) != 0: return standardMsg = '%s == %s within %r places' % (safe_repr(first), safe_repr(second), places) msg = self._formatMessage(msg, standardMsg) raise self.failureException(msg)
def assertNotContains(
self, response, text, status_code=200, msg_prefix=u'', html=False)
Asserts that a response indicates that some content was retrieved
successfully, (i.e., the HTTP status code was as expected), and that
text
doesn't occurs in the content of the response.
def assertNotContains(self, response, text, status_code=200, msg_prefix='', html=False): """ Asserts that a response indicates that some content was retrieved successfully, (i.e., the HTTP status code was as expected), and that ``text`` doesn't occurs in the content of the response. """ # If the response supports deferred rendering and hasn't been rendered # yet, then ensure that it does get rendered before proceeding further. if (hasattr(response, 'render') and callable(response.render) and not response.is_rendered): response.render() if msg_prefix: msg_prefix += ": " self.assertEqual(response.status_code, status_code, msg_prefix + "Couldn't retrieve content: Response code was %d" " (expected %d)" % (response.status_code, status_code)) content = response.content if not isinstance(text, bytes) or html: text = force_text(text, encoding=response._charset) content = content.decode(response._charset) text_repr = "'%s'" % text else: text_repr = repr(text) if html: content = assert_and_parse_html(self, content, None, 'Response\'s content is not valid HTML:') text = assert_and_parse_html(self, text, None, 'Second argument is not valid HTML:') self.assertEqual(content.count(text), 0, msg_prefix + "Response should not contain %s" % text_repr)
def assertNotEqual(
self, first, second, msg=None)
Fail if the two objects are equal as determined by the '!=' operator.
def assertNotEqual(self, first, second, msg=None): """Fail if the two objects are equal as determined by the '!=' operator. """ if not first != second: msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first), safe_repr(second))) raise self.failureException(msg)
def assertNotEquals(
self, first, second, msg=None)
Fail if the two objects are equal as determined by the '!=' operator.
def assertNotEqual(self, first, second, msg=None): """Fail if the two objects are equal as determined by the '!=' operator. """ if not first != second: msg = self._formatMessage(msg, '%s == %s' % (safe_repr(first), safe_repr(second))) raise self.failureException(msg)
def assertNotIn(
self, member, container, msg=None)
Just like self.assertTrue(a not in b), but with a nicer default message.
def assertNotIn(self, member, container, msg=None): """Just like self.assertTrue(a not in b), but with a nicer default message.""" if member in container: standardMsg = '%s unexpectedly found in %s' % (safe_repr(member), safe_repr(container)) self.fail(self._formatMessage(msg, standardMsg))
def assertNotIsInstance(
self, obj, cls, msg=None)
Included for symmetry with assertIsInstance.
def assertNotIsInstance(self, obj, cls, msg=None): """Included for symmetry with assertIsInstance.""" if isinstance(obj, cls): standardMsg = '%s is an instance of %r' % (safe_repr(obj), cls) self.fail(self._formatMessage(msg, standardMsg))
def assertNotRegexpMatches(
self, text, unexpected_regexp, msg=None)
Fail the test if the text matches the regular expression.
def assertNotRegexpMatches(self, text, unexpected_regexp, msg=None): """Fail the test if the text matches the regular expression.""" if isinstance(unexpected_regexp, basestring): unexpected_regexp = re.compile(unexpected_regexp) match = unexpected_regexp.search(text) if match: msg = msg or "Regexp matched" msg = '%s: %r matches %r in %r' % (msg, text[match.start():match.end()], unexpected_regexp.pattern, text) raise self.failureException(msg)
def assertNumQueries(
self, num, func=None, *args, **kwargs)
def assertNumQueries(self, num, func=None, *args, **kwargs): using = kwargs.pop("using", DEFAULT_DB_ALIAS) conn = connections[using] context = _AssertNumQueriesContext(self, num, conn) if func is None: return context with context: func(*args, **kwargs)
def assertQuerysetEqual(
self, qs, values, transform=<built-in function repr>, ordered=True)
def assertQuerysetEqual(self, qs, values, transform=repr, ordered=True): items = six.moves.map(transform, qs) if not ordered: return self.assertEqual(set(items), set(values)) values = list(values) # For example qs.iterator() could be passed as qs, but it does not # have 'ordered' attribute. if len(values) > 1 and hasattr(qs, 'ordered') and not qs.ordered: raise ValueError("Trying to compare non-ordered queryset " "against more than one ordered values") return self.assertEqual(list(items), values)
def assertRaises(
self, excClass, callableObj=None, *args, **kwargs)
Fail unless an exception of class excClass is raised by callableObj when invoked with arguments args and keyword arguments kwargs. If a different type of exception is raised, it will not be caught, and the test case will be deemed to have suffered an error, exactly as for an unexpected exception.
If called with callableObj omitted or None, will return a context object used like this::
with self.assertRaises(SomeException): do_something()
The context manager keeps a reference to the exception as the 'exception' attribute. This allows you to inspect the exception after the assertion::
with self.assertRaises(SomeException) as cm: do_something() the_exception = cm.exception self.assertEqual(the_exception.error_code, 3)
def assertRaises(self, excClass, callableObj=None, *args, **kwargs): """Fail unless an exception of class excClass is raised by callableObj when invoked with arguments args and keyword arguments kwargs. If a different type of exception is raised, it will not be caught, and the test case will be deemed to have suffered an error, exactly as for an unexpected exception. If called with callableObj omitted or None, will return a context object used like this:: with self.assertRaises(SomeException): do_something() The context manager keeps a reference to the exception as the 'exception' attribute. This allows you to inspect the exception after the assertion:: with self.assertRaises(SomeException) as cm: do_something() the_exception = cm.exception self.assertEqual(the_exception.error_code, 3) """ context = _AssertRaisesContext(excClass, self) if callableObj is None: return context with context: callableObj(*args, **kwargs)
def assertRaisesMessage(
self, expected_exception, expected_message, callable_obj=None, *args, **kwargs)
Asserts that the message in a raised exception matches the passed value.
Args: expected_exception: Exception class expected to be raised. expected_message: expected error message string value. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs.
def assertRaisesMessage(self, expected_exception, expected_message, callable_obj=None, *args, **kwargs): """ Asserts that the message in a raised exception matches the passed value. Args: expected_exception: Exception class expected to be raised. expected_message: expected error message string value. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs. """ return six.assertRaisesRegex(self, expected_exception, re.escape(expected_message), callable_obj, *args, **kwargs)
def assertRaisesRegexp(
self, expected_exception, expected_regexp, callable_obj=None, *args, **kwargs)
Asserts that the message in a raised exception matches a regexp.
Args: expected_exception: Exception class expected to be raised. expected_regexp: Regexp (re pattern object or string) expected to be found in error message. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs.
def assertRaisesRegexp(self, expected_exception, expected_regexp, callable_obj=None, *args, **kwargs): """Asserts that the message in a raised exception matches a regexp. Args: expected_exception: Exception class expected to be raised. expected_regexp: Regexp (re pattern object or string) expected to be found in error message. callable_obj: Function to be called. args: Extra args. kwargs: Extra kwargs. """ if expected_regexp is not None: expected_regexp = re.compile(expected_regexp) context = _AssertRaisesContext(expected_exception, self, expected_regexp) if callable_obj is None: return context with context: callable_obj(*args, **kwargs)
def assertRedirects(
self, response, expected_url, status_code=302, target_status_code=200, host=None, msg_prefix=u'')
Asserts that a response redirected to a specific URL, and that the redirect URL can be loaded.
Note that assertRedirects won't work for external links since it uses TestClient to do a request.
def assertRedirects(self, response, expected_url, status_code=302, target_status_code=200, host=None, msg_prefix=''): """Asserts that a response redirected to a specific URL, and that the redirect URL can be loaded. Note that assertRedirects won't work for external links since it uses TestClient to do a request. """ if msg_prefix: msg_prefix += ": " if hasattr(response, 'redirect_chain'): # The request was a followed redirect self.assertTrue(len(response.redirect_chain) > 0, msg_prefix + "Response didn't redirect as expected: Response" " code was %d (expected %d)" % (response.status_code, status_code)) self.assertEqual(response.redirect_chain[0][1], status_code, msg_prefix + "Initial response didn't redirect as expected:" " Response code was %d (expected %d)" % (response.redirect_chain[0][1], status_code)) url, status_code = response.redirect_chain[-1] self.assertEqual(response.status_code, target_status_code, msg_prefix + "Response didn't redirect as expected: Final" " Response code was %d (expected %d)" % (response.status_code, target_status_code)) else: # Not a followed redirect self.assertEqual(response.status_code, status_code, msg_prefix + "Response didn't redirect as expected: Response" " code was %d (expected %d)" % (response.status_code, status_code)) url = response.url scheme, netloc, path, query, fragment = urlsplit(url) redirect_response = response.client.get(path, QueryDict(query)) # Get the redirection page, using the same client that was used # to obtain the original response. self.assertEqual(redirect_response.status_code, target_status_code, msg_prefix + "Couldn't retrieve redirection page '%s':" " response code was %d (expected %d)" % (path, redirect_response.status_code, target_status_code)) e_scheme, e_netloc, e_path, e_query, e_fragment = urlsplit( expected_url) if not (e_scheme or e_netloc): expected_url = urlunsplit(('http', host or 'testserver', e_path, e_query, e_fragment)) self.assertEqual(url, expected_url, msg_prefix + "Response redirected to '%s', expected '%s'" % (url, expected_url))
def assertRegexpMatches(
self, text, expected_regexp, msg=None)
Fail the test unless the text matches the regular expression.
def assertRegexpMatches(self, text, expected_regexp, msg=None): """Fail the test unless the text matches the regular expression.""" if isinstance(expected_regexp, basestring): expected_regexp = re.compile(expected_regexp) if not expected_regexp.search(text): msg = msg or "Regexp didn't match" msg = '%s: %r not found in %r' % (msg, expected_regexp.pattern, text) raise self.failureException(msg)
def assertSequenceEqual(
self, seq1, seq2, msg=None, seq_type=None)
An equality assertion for ordered sequences (like lists and tuples).
For the purposes of this function, a valid ordered sequence type is one which can be indexed, has a length, and has an equality operator.
Args: seq1: The first sequence to compare. seq2: The second sequence to compare. seq_type: The expected datatype of the sequences, or None if no datatype should be enforced. msg: Optional message to use on failure instead of a list of differences.
def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None): """An equality assertion for ordered sequences (like lists and tuples). For the purposes of this function, a valid ordered sequence type is one which can be indexed, has a length, and has an equality operator. Args: seq1: The first sequence to compare. seq2: The second sequence to compare. seq_type: The expected datatype of the sequences, or None if no datatype should be enforced. msg: Optional message to use on failure instead of a list of differences. """ if seq_type is not None: seq_type_name = seq_type.__name__ if not isinstance(seq1, seq_type): raise self.failureException('First sequence is not a %s: %s' % (seq_type_name, safe_repr(seq1))) if not isinstance(seq2, seq_type): raise self.failureException('Second sequence is not a %s: %s' % (seq_type_name, safe_repr(seq2))) else: seq_type_name = "sequence" differing = None try: len1 = len(seq1) except (TypeError, NotImplementedError): differing = 'First %s has no length. Non-sequence?' % ( seq_type_name) if differing is None: try: len2 = len(seq2) except (TypeError, NotImplementedError): differing = 'Second %s has no length. Non-sequence?' % ( seq_type_name) if differing is None: if seq1 == seq2: return seq1_repr = safe_repr(seq1) seq2_repr = safe_repr(seq2) if len(seq1_repr) > 30: seq1_repr = seq1_repr[:30] + '...' if len(seq2_repr) > 30: seq2_repr = seq2_repr[:30] + '...' elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr) differing = '%ss differ: %s != %s\n' % elements for i in xrange(min(len1, len2)): try: item1 = seq1[i] except (TypeError, IndexError, NotImplementedError): differing += ('\nUnable to index element %d of first %s\n' % (i, seq_type_name)) break try: item2 = seq2[i] except (TypeError, IndexError, NotImplementedError): differing += ('\nUnable to index element %d of second %s\n' % (i, seq_type_name)) break if item1 != item2: differing += ('\nFirst differing element %d:\n%s\n%s\n' % (i, safe_repr(item1), safe_repr(item2))) break else: if (len1 == len2 and seq_type is None and type(seq1) != type(seq2)): # The sequences are the same, but have differing types. return if len1 > len2: differing += ('\nFirst %s contains %d additional ' 'elements.\n' % (seq_type_name, len1 - len2)) try: differing += ('First extra element %d:\n%s\n' % (len2, safe_repr(seq1[len2]))) except (TypeError, IndexError, NotImplementedError): differing += ('Unable to index element %d ' 'of first %s\n' % (len2, seq_type_name)) elif len1 < len2: differing += ('\nSecond %s contains %d additional ' 'elements.\n' % (seq_type_name, len2 - len1)) try: differing += ('First extra element %d:\n%s\n' % (len1, safe_repr(seq2[len1]))) except (TypeError, IndexError, NotImplementedError): differing += ('Unable to index element %d ' 'of second %s\n' % (len1, seq_type_name)) standardMsg = differing diffMsg = '\n' + '\n'.join( difflib.ndiff(pprint.pformat(seq1).splitlines(), pprint.pformat(seq2).splitlines())) standardMsg = self._truncateMessage(standardMsg, diffMsg) msg = self._formatMessage(msg, standardMsg) self.fail(msg)
def assertSetEqual(
self, set1, set2, msg=None)
A set-specific equality assertion.
Args: set1: The first set to compare. set2: The second set to compare. msg: Optional message to use on failure instead of a list of differences.
assertSetEqual uses ducktyping to support different types of sets, and is optimized for sets specifically (parameters must support a difference method).
def assertSetEqual(self, set1, set2, msg=None): """A set-specific equality assertion. Args: set1: The first set to compare. set2: The second set to compare. msg: Optional message to use on failure instead of a list of differences. assertSetEqual uses ducktyping to support different types of sets, and is optimized for sets specifically (parameters must support a difference method). """ try: difference1 = set1.difference(set2) except TypeError, e: self.fail('invalid type when attempting set difference: %s' % e) except AttributeError, e: self.fail('first argument does not support set difference: %s' % e) try: difference2 = set2.difference(set1) except TypeError, e: self.fail('invalid type when attempting set difference: %s' % e) except AttributeError, e: self.fail('second argument does not support set difference: %s' % e) if not (difference1 or difference2): return lines = [] if difference1: lines.append('Items in the first set but not the second:') for item in difference1: lines.append(repr(item)) if difference2: lines.append('Items in the second set but not the first:') for item in difference2: lines.append(repr(item)) standardMsg = '\n'.join(lines) self.fail(self._formatMessage(msg, standardMsg))
def assertTemplateNotUsed(
self, response=None, template_name=None, msg_prefix=u'')
Asserts that the template with the provided name was NOT used in rendering the response. Also usable as context manager.
def assertTemplateNotUsed(self, response=None, template_name=None, msg_prefix=''): """ Asserts that the template with the provided name was NOT used in rendering the response. Also usable as context manager. """ if response is None and template_name is None: raise TypeError('response and/or template_name argument must be provided') if msg_prefix: msg_prefix += ": " # Use assertTemplateUsed as context manager. if not hasattr(response, 'templates') or (response is None and template_name): if response: template_name = response response = None context = _AssertTemplateNotUsedContext(self, template_name) return context template_names = [t.name for t in response.templates] self.assertFalse(template_name in template_names, msg_prefix + "Template '%s' was used unexpectedly in rendering" " the response" % template_name)
def assertTemplateUsed(
self, response=None, template_name=None, msg_prefix=u'')
Asserts that the template with the provided name was used in rendering the response. Also usable as context manager.
def assertTemplateUsed(self, response=None, template_name=None, msg_prefix=''): """ Asserts that the template with the provided name was used in rendering the response. Also usable as context manager. """ if response is None and template_name is None: raise TypeError('response and/or template_name argument must be provided') if msg_prefix: msg_prefix += ": " # Use assertTemplateUsed as context manager. if not hasattr(response, 'templates') or (response is None and template_name): if response: template_name = response response = None context = _AssertTemplateUsedContext(self, template_name) return context template_names = [t.name for t in response.templates] if not template_names: self.fail(msg_prefix + "No templates used to render the response") self.assertTrue(template_name in template_names, msg_prefix + "Template '%s' was not a template used to render" " the response. Actual template(s) used: %s" % (template_name, ', '.join(template_names)))
def assertTrue(
self, expr, msg=None)
Check that the expression is true.
def assertTrue(self, expr, msg=None): """Check that the expression is true.""" if not expr: msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr)) raise self.failureException(msg)
def assertTupleEqual(
self, tuple1, tuple2, msg=None)
A tuple-specific equality assertion.
Args: tuple1: The first tuple to compare. tuple2: The second tuple to compare. msg: Optional message to use on failure instead of a list of differences.
def assertTupleEqual(self, tuple1, tuple2, msg=None): """A tuple-specific equality assertion. Args: tuple1: The first tuple to compare. tuple2: The second tuple to compare. msg: Optional message to use on failure instead of a list of differences. """ self.assertSequenceEqual(tuple1, tuple2, msg, seq_type=tuple)
def assertXMLEqual(
self, xml1, xml2, msg=None)
Asserts that two XML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML.
def assertXMLEqual(self, xml1, xml2, msg=None): """ Asserts that two XML snippets are semantically the same. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML. """ try: result = compare_xml(xml1, xml2) except Exception as e: standardMsg = 'First or second argument is not valid XML\n%s' % e self.fail(self._formatMessage(msg, standardMsg)) else: if not result: standardMsg = '%s != %s' % (safe_repr(xml1, True), safe_repr(xml2, True)) self.fail(self._formatMessage(msg, standardMsg))
def assertXMLNotEqual(
self, xml1, xml2, msg=None)
Asserts that two XML snippets are not semantically equivalent. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML.
def assertXMLNotEqual(self, xml1, xml2, msg=None): """ Asserts that two XML snippets are not semantically equivalent. Whitespace in most cases is ignored, and attribute ordering is not significant. The passed-in arguments must be valid XML. """ try: result = compare_xml(xml1, xml2) except Exception as e: standardMsg = 'First or second argument is not valid XML\n%s' % e self.fail(self._formatMessage(msg, standardMsg)) else: if result: standardMsg = '%s == %s' % (safe_repr(xml1, True), safe_repr(xml2, True)) self.fail(self._formatMessage(msg, standardMsg))
def assert_(
self, expr, msg=None)
Check that the expression is true.
def assertTrue(self, expr, msg=None): """Check that the expression is true.""" if not expr: msg = self._formatMessage(msg, "%s is not true" % safe_repr(expr)) raise self.failureException(msg)
def countTestCases(
self)
def countTestCases(self): return 1
def debug(
self)
Run the test without collecting errors in a TestResult
def debug(self): """Run the test without collecting errors in a TestResult""" self.setUp() getattr(self, self._testMethodName)() self.tearDown() while self._cleanups: function, args, kwargs = self._cleanups.pop(-1) function(*args, **kwargs)
def defaultTestResult(
self)
def defaultTestResult(self): return result.TestResult()
def doCleanups(
self)
Execute all cleanup functions. Normally called for you after tearDown.
def doCleanups(self): """Execute all cleanup functions. Normally called for you after tearDown.""" result = self._resultForDoCleanups ok = True while self._cleanups: function, args, kwargs = self._cleanups.pop(-1) try: function(*args, **kwargs) except KeyboardInterrupt: raise except: ok = False result.addError(self, sys.exc_info()) return ok
def fail(
self, msg=None)
Fail immediately, with the given message.
def fail(self, msg=None): """Fail immediately, with the given message.""" raise self.failureException(msg)
def failIf(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failIfAlmostEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failIfEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnless(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnlessAlmostEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnlessEqual(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def failUnlessRaises(
*args, **kwargs)
def deprecated_func(*args, **kwargs): warnings.warn( 'Please use {0} instead.'.format(original_func.__name__), PendingDeprecationWarning, 2) return original_func(*args, **kwargs)
def id(
self)
def id(self): return "%s.%s" % (strclass(self.__class__), self._testMethodName)
def restore_warnings_state(
self)
Restores the state of the warnings module to the state saved by save_warnings_state()
def restore_warnings_state(self): """ Restores the state of the warnings module to the state saved by save_warnings_state() """ warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2) warnings.filters = self._warnings_state[:]
def run(
self, result=None)
def run(self, result=None): orig_result = result if result is None: result = self.defaultTestResult() startTestRun = getattr(result, 'startTestRun', None) if startTestRun is not None: startTestRun() self._resultForDoCleanups = result result.startTest(self) testMethod = getattr(self, self._testMethodName) if (getattr(self.__class__, "__unittest_skip__", False) or getattr(testMethod, "__unittest_skip__", False)): # If the class or method was skipped. try: skip_why = (getattr(self.__class__, '__unittest_skip_why__', '') or getattr(testMethod, '__unittest_skip_why__', '')) self._addSkip(result, skip_why) finally: result.stopTest(self) return try: success = False try: self.setUp() except SkipTest as e: self._addSkip(result, str(e)) except KeyboardInterrupt: raise except: result.addError(self, sys.exc_info()) else: try: testMethod() except KeyboardInterrupt: raise except self.failureException: result.addFailure(self, sys.exc_info()) except _ExpectedFailure as e: addExpectedFailure = getattr(result, 'addExpectedFailure', None) if addExpectedFailure is not None: addExpectedFailure(self, e.exc_info) else: warnings.warn("TestResult has no addExpectedFailure method, reporting as passes", RuntimeWarning) result.addSuccess(self) except _UnexpectedSuccess: addUnexpectedSuccess = getattr(result, 'addUnexpectedSuccess', None) if addUnexpectedSuccess is not None: addUnexpectedSuccess(self) else: warnings.warn("TestResult has no addUnexpectedSuccess method, reporting as failures", RuntimeWarning) result.addFailure(self, sys.exc_info()) except SkipTest as e: self._addSkip(result, str(e)) except: result.addError(self, sys.exc_info()) else: success = True try: self.tearDown() except KeyboardInterrupt: raise except: result.addError(self, sys.exc_info()) success = False cleanUpSuccess = self.doCleanups() success = success and cleanUpSuccess if success: result.addSuccess(self) finally: result.stopTest(self) if orig_result is None: stopTestRun = getattr(result, 'stopTestRun', None) if stopTestRun is not None: stopTestRun()
def save_warnings_state(
self)
Saves the state of the warnings module
def save_warnings_state(self): """ Saves the state of the warnings module """ warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2) self._warnings_state = warnings.filters[:]
def setUp(
self)
def setUp(self): self.publisher1 = Publisher.objects.create(id=1, value='publisher1') self.publisher2 = Publisher.objects.create(id=2, value='publisher2') self.pubcollection1 = PublisherCollection.objects.create(publisher=self.publisher1, value='pub1_collection1') self.rights1 = LegalRight.objects.create(id=1, value='right1') MediaCollection.objects.create(id=1, code='CNRSMH_I_1256_456', title='Collection1', publisher=self.publisher1, publisher_collection=self.pubcollection1, legal_rights=self.rights1) MediaCollection.objects.create(id=2, code='CNRSMH_I_1256_123', title='Collection2', publisher=self.publisher2)
def setUpClass(
cls)
Hook method for setting up class fixture before running tests in the class.
@classmethod def setUpClass(cls): "Hook method for setting up class fixture before running tests in the class."
def settings(
self, **kwargs)
A context manager that temporarily sets a setting and reverts back to the original value when exiting the context.
def settings(self, **kwargs): """ A context manager that temporarily sets a setting and reverts back to the original value when exiting the context. """ return override_settings(**kwargs)
def shortDescription(
self)
Returns a one-line description of the test, or None if no description has been provided.
The default implementation of this method returns the first line of the specified test method's docstring.
def shortDescription(self): """Returns a one-line description of the test, or None if no description has been provided. The default implementation of this method returns the first line of the specified test method's docstring. """ doc = self._testMethodDoc return doc and doc.split("\n")[0].strip() or None
def skipTest(
self, reason)
Skip this test.
def skipTest(self, reason): """Skip this test.""" raise SkipTest(reason)
def tearDown(
self)
def tearDown(self): Publisher.objects.all().delete() PublisherCollection.objects.all().delete() LegalRight.objects.all().delete() MediaCollection.objects.all().delete()
def tearDownClass(
cls)
Hook method for deconstructing the class fixture after running all tests in the class.
@classmethod def tearDownClass(cls): "Hook method for deconstructing the class fixture after running all tests in the class."
def testOnDeleteCascade(
self)
def testOnDeleteCascade(self): self.publisher1.delete() self.assertEquals(Publisher.objects.filter(id=1).count(), 0) self.assertEquals(Publisher.objects.filter(id=2).count(), 1) self.assertEquals(PublisherCollection.objects.filter(id=1).count(), 0) q = MediaCollection.objects.filter(id=1) self.assertEquals(q.count(), 1) self.assertEquals(q[0].publisher, None) self.assertEquals(q[0].publisher_collection, None) q = MediaCollection.objects.filter(id=2) self.assertEquals(q.count(), 1) self.assertEquals(q[0].publisher, self.publisher2) self.assertEquals(q[0].publisher_collection, None)
def testOnDeleteMultiple(
self)
def testOnDeleteMultiple(self): Publisher.objects.all().delete() self.assertEquals(Publisher.objects.count(), 0) self.assertEquals(PublisherCollection.objects.count(), 0) self.assertEquals(MediaCollection.objects.count(), 2)
def testOnDeleteSetNull(
self)
def testOnDeleteSetNull(self): self.rights1.delete() self.assertEquals(LegalRight.objects.filter(id=1).count(), 0) q = MediaCollection.objects.filter(id=1) self.assertEquals(q.count(), 1) self.assertEquals(q[0].legal_rights, None)