diff --git a/.gitignore b/.gitignore index fd33c6a..f2f93ed 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ *.sqlite *~ example_project/tmp/* +example_project/medias +example_project/data.db \ No newline at end of file diff --git a/example_project/data.db b/example_project/data.db deleted file mode 100644 index 9f7d27a..0000000 Binary files a/example_project/data.db and /dev/null differ diff --git a/example_project/example_app/onthefly_rules.py b/example_project/example_app/sequential_rules.py similarity index 94% rename from example_project/example_app/onthefly_rules.py rename to example_project/example_app/sequential_rules.py index 3e81648..7b6902f 100644 --- a/example_project/example_app/onthefly_rules.py +++ b/example_project/example_app/sequential_rules.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import os +import hashlib from datetime import datetime @@ -106,3 +108,10 @@ class AnotherBelovedPartner(BelovedPartner): """ packer = ZIPPacker + + @property + def archive_name(self): + m = hashlib.sha1() + m.update(os.urandom(24)) + filename = m.hexdigest() + return '%s.zip' % filename diff --git a/example_project/example_app/tests.py b/example_project/example_app/tests.py deleted file mode 100644 index 501deb7..0000000 --- a/example_project/example_app/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - -from django.test import TestCase - - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) diff --git a/example_project/example_app/tests/__init__.py b/example_project/example_app/tests/__init__.py new file mode 100644 index 0000000..3ce6a08 --- /dev/null +++ b/example_project/example_app/tests/__init__.py @@ -0,0 +1,4 @@ +from sequential.zip_packer import * +from sequential.flat_packer import * +from mass.zip_packer import * +from mass.flat_packer import * diff --git a/example_project/example_app/tests/base.py b/example_project/example_app/tests/base.py new file mode 100644 index 0000000..789a31f --- /dev/null +++ b/example_project/example_app/tests/base.py @@ -0,0 +1,58 @@ +import os +import shutil + +from django.conf import settings +from django.test import TestCase + +from carrier_pigeon.registry import REGISTRY + + +REGISTRY_COPY = dict(REGISTRY) + +class ImplementationBaseTests(TestCase): + + @property + def outbox(self): + path = os.path.join( + settings.SITE_ROOT, + 'tmp', + 'export', + self.tested_configuration_name, + 'outbox', + ) + return path + + def clean_outbox(self): + path = self.outbox + if os.path.exists(path): + shutil.rmtree(path) + + def data(self, filename): + path = os.path.join( + os.path.dirname(__file__), + 'data', + self.tested_configuration_name, + filename + ) + return path + + def setUp(self): + # remove from registred configuration + # configuration that we do no test in current test class + REGISTRY.clear() + for key, item in REGISTRY_COPY.iteritems(): + print key, item + if key == self.tested_configuration_name: + REGISTRY[key] = item + self.clean_outbox() + + def tearDown(self): + self.clean_outbox() + + # clean media content + path = os.path.join( + settings.SITE_ROOT, + 'medias', + 'photo', + ) + shutil.rmtree(path) diff --git a/example_project/example_app/tests/data/anotherbelovedpartner/NEWS_example_app_1.xml b/example_project/example_app/tests/data/anotherbelovedpartner/NEWS_example_app_1.xml new file mode 100644 index 0000000..b0d05e2 --- /dev/null +++ b/example_project/example_app/tests/data/anotherbelovedpartner/NEWS_example_app_1.xml @@ -0,0 +1,2 @@ + +An egg & and a chickenMay 2, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/medias/1.jpgAn egg & and a chicken1The dear and the fawn 2Tazmania devil dog3
diff --git a/example_project/example_app/tests/data/anotherbelovedpartner/NEWS_example_app_2.xml b/example_project/example_app/tests/data/anotherbelovedpartner/NEWS_example_app_2.xml new file mode 100644 index 0000000..a8549e0 --- /dev/null +++ b/example_project/example_app/tests/data/anotherbelovedpartner/NEWS_example_app_2.xml @@ -0,0 +1,2 @@ + +The dear and the fawn May 2, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/medias/1.jpgAn egg & and a chicken1The dear and the fawn 2Tazmania devil dog3
diff --git a/example_project/example_app/tests/data/belovedpartner/NEWS_example_app_1.xml b/example_project/example_app/tests/data/belovedpartner/NEWS_example_app_1.xml new file mode 100644 index 0000000..b0d05e2 --- /dev/null +++ b/example_project/example_app/tests/data/belovedpartner/NEWS_example_app_1.xml @@ -0,0 +1,2 @@ + +An egg & and a chickenMay 2, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/medias/1.jpgAn egg & and a chicken1The dear and the fawn 2Tazmania devil dog3
diff --git a/example_project/example_app/tests/data/belovedpartner/NEWS_example_app_2.xml b/example_project/example_app/tests/data/belovedpartner/NEWS_example_app_2.xml new file mode 100644 index 0000000..a8549e0 --- /dev/null +++ b/example_project/example_app/tests/data/belovedpartner/NEWS_example_app_2.xml @@ -0,0 +1,2 @@ + +The dear and the fawn May 2, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/medias/1.jpgAn egg & and a chicken1The dear and the fawn 2Tazmania devil dog3
diff --git a/example_project/example_app/tests/data/flatmassexport/example_app_story_1.xml b/example_project/example_app/tests/data/flatmassexport/example_app_story_1.xml new file mode 100644 index 0000000..cc3449f --- /dev/null +++ b/example_project/example_app/tests/data/flatmassexport/example_app_story_1.xml @@ -0,0 +1,2 @@ + +An egg & and a chickenMay 3, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/photos/1.jpg
diff --git a/example_project/example_app/tests/data/flatmassexport/example_app_story_2.xml b/example_project/example_app/tests/data/flatmassexport/example_app_story_2.xml new file mode 100644 index 0000000..f9b370d --- /dev/null +++ b/example_project/example_app/tests/data/flatmassexport/example_app_story_2.xml @@ -0,0 +1,2 @@ + +The dear and the fawn May 3, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/photos/1.jpg
diff --git a/example_project/example_app/tests/data/flatmassexport/photos/1.jpg b/example_project/example_app/tests/data/flatmassexport/photos/1.jpg new file mode 100755 index 0000000..fa5b0e9 --- /dev/null +++ b/example_project/example_app/tests/data/flatmassexport/photos/1.jpg @@ -0,0 +1 @@ +coucou \ No newline at end of file diff --git a/example_project/example_app/tests/data/weeklydigest/example_app_story_1.xml b/example_project/example_app/tests/data/weeklydigest/example_app_story_1.xml new file mode 100644 index 0000000..1c6574d --- /dev/null +++ b/example_project/example_app/tests/data/weeklydigest/example_app_story_1.xml @@ -0,0 +1,2 @@ + +An egg & and a chickenMay 2, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/medias/1.jpg
diff --git a/example_project/example_app/tests/data/weeklydigest/example_app_story_2.xml b/example_project/example_app/tests/data/weeklydigest/example_app_story_2.xml new file mode 100644 index 0000000..8faf9fc --- /dev/null +++ b/example_project/example_app/tests/data/weeklydigest/example_app_story_2.xml @@ -0,0 +1,2 @@ + +The dear and the fawn May 2, 2012

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

/medias/1.jpg
diff --git a/example_project/example_app/tests/mass/__init__.py b/example_project/example_app/tests/mass/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/example_project/example_app/tests/mass/flat_packer.py b/example_project/example_app/tests/mass/flat_packer.py new file mode 100644 index 0000000..7999c1f --- /dev/null +++ b/example_project/example_app/tests/mass/flat_packer.py @@ -0,0 +1,116 @@ +import os +import shutil +import hashlib +import zipfile +from StringIO import StringIO +from datetime import datetime +from datetime import timedelta + +from django.conf import settings +from django.core.files import File +from django.core.management import call_command + +from carrier_pigeon.models import ItemToPush + +from example_app.models import Photo +from example_app.models import Story +from example_app.tests.base import ImplementationBaseTests + + +class FlatMassExportTest(ImplementationBaseTests): + """Check proper behavior of WeeklyDigest mass zip export configuration""" + + tested_configuration_name = 'flatmassexport' + + def setUp(self): + super(FlatMassExportTest, self).setUp() + + settings.CARRIER_PIGEON_PUSH_URLS = { + self.tested_configuration_name: ( + "dummy://user:pwd@ftp.weeklydigest.tld", + ), + } + + # create Photo instance + + # build a random filename + m = hashlib.sha1() + m.update(os.urandom(24)) + filepath = '/tmp/%s.jpeg' % m.hexdigest() + # open and write photo filename with data + fd = open(filepath, 'w') + fd.write('coucou') + fd.close() + fd = open(filepath) + # create Photo object + photo = Photo( + title='Egg', + credits='Chicken', + caption='An egg created by a chicken', + original_file=File(fd), + ) + photo.save() + + # don't forget to clean + os.remove(filepath) + + # build story objects + self.stories = [] + + # the following two stories will be selected + # by the configuration + story = Story( + title='An egg & and a chicken', + workflow_state=Story.WORKFLOW_STATE.ONLINE, + content='a'*500, + photo=photo, + updating_date=datetime.now() + ) + story.save() + self.stories.append(story) + story = Story( + title='The dear and the fawn ', + workflow_state=Story.WORKFLOW_STATE.ONLINE, + content='a'*500, + photo=photo, + updating_date=datetime.now() + ) + story.save() + self.stories.append(story) + + # This story is not selected + story = Story( + title='Tazmania devil dog', + workflow_state=Story.WORKFLOW_STATE.OFFLINE, + content='a'*500, + photo=photo, + updating_date=datetime.now() - timedelta(days=99) + ) + story.save() + + def _test_content(self): + for story in self.stories: + filename = 'example_app_story_%s.xml' % story.pk + filepath = os.path.join( + self.outbox, + filename, + ) + with open(filepath) as f: + with open(self.data(filename)) as d: + self.assertEqual( + f.read(), + d.read(), + ) + + photopath = os.path.join( + self.outbox, + 'photos', + '1.jpg', + ) + self.assertTrue(os.path.exists(photopath)) + with open(photopath) as f: + self.assertEqual(f.read(), 'coucou') + + def test_pigeon_push(self): + call_command('pigeon_mass_push', 'flatmassexport') + self._test_content() diff --git a/example_project/example_app/tests/mass/zip_packer.py b/example_project/example_app/tests/mass/zip_packer.py new file mode 100644 index 0000000..34d6153 --- /dev/null +++ b/example_project/example_app/tests/mass/zip_packer.py @@ -0,0 +1,127 @@ +import os +import shutil +import hashlib +import zipfile +from StringIO import StringIO +from datetime import date +from datetime import datetime +from datetime import timedelta + +from django.conf import settings +from django.core.files import File +from django.core.management import call_command + +from carrier_pigeon.models import ItemToPush + +from example_app.models import Photo +from example_app.models import Story +from example_app.tests.base import ImplementationBaseTests + + +class WeeklyDigestTests(ImplementationBaseTests): + """Check proper behavior of WeeklyDigest mass zip export configuration""" + + tested_configuration_name = 'weeklydigest' + + def setUp(self): + super(WeeklyDigestTests, self).setUp() + + settings.CARRIER_PIGEON_PUSH_URLS = { + self.tested_configuration_name: ( + "dummy://user:pwd@ftp.weeklydigest.tld", + ), + } + + # create Photo instance + + # build a random filename + m = hashlib.sha1() + m.update(os.urandom(24)) + filepath = '/tmp/%s.jpeg' % m.hexdigest() + # open and write photo filename with data + fd = open(filepath, 'w') + fd.write('coucou') + fd.close() + fd = open(filepath) + # create Photo object + photo = Photo( + title='Egg', + credits='Chicken', + caption='An egg created by a chicken', + original_file=File(fd), + ) + photo.save() + + # don't forget to clean + os.remove(filepath) + + # build story objects + self.stories = [] + + # the following two stories will be selected + # by the configuration + story = Story( + title='An egg & and a chicken', + workflow_state=Story.WORKFLOW_STATE.ONLINE, + content='a'*500, + photo=photo, + updating_date=date(2012, 5, 2) + ) + story.save() + self.stories.append(story) + story = Story( + title='The dear and the fawn ', + workflow_state=Story.WORKFLOW_STATE.ONLINE, + content='a'*500, + photo=photo, + updating_date=date(2012, 5, 2) + ) + story.save() + self.stories.append(story) + + # This story is not selected + story = Story( + title='Tazmania devil dog', + workflow_state=Story.WORKFLOW_STATE.OFFLINE, + content='a'*500, + photo=photo, + updating_date=date(2012, 5, 2) + ) + story.save() + + def _test_content(self): + for story in self.stories: + filename = 'example_app_story_%s.xml' % story.pk + filepath = os.path.join( + self.outbox, + filename, + ) + with open(filepath) as f: + with open(self.data(filename)) as d: + self.assertEqual( + f.read(), + d.read(), + ) + + photopath = os.path.join( + self.outbox, + 'photos', + '1.jpg', + ) + self.assertTrue(os.path.exists(photopath)) + with open(photopath) as f: + self.assertEqual(f.read(), 'coucou') + + def test_pigeon_push(self): + call_command('pigeon_mass_push', 'weeklydigest') + listdir = os.listdir(self.outbox) + self.assertEqual(len(listdir), 1) + filename = listdir[0] + self.assertEqual(filename, 'weeklydigest.zip') + path = os.path.join( + self.outbox, + filename, + ) + zzz = zipfile.ZipFile(path) + zzz.extractall(self.outbox) + self._test_content() diff --git a/example_project/example_app/tests/sequential/__init__.py b/example_project/example_app/tests/sequential/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/example_project/example_app/tests/sequential/base.py b/example_project/example_app/tests/sequential/base.py new file mode 100644 index 0000000..129a0f3 --- /dev/null +++ b/example_project/example_app/tests/sequential/base.py @@ -0,0 +1,110 @@ +import os +import shutil +import hashlib +from StringIO import StringIO +from datetime import date + +from django.conf import settings +from django.core.files import File + +from carrier_pigeon.models import ItemToPush + +from example_app.models import Photo +from example_app.models import Story +from example_app.tests.base import ImplementationBaseTests + + +# This is exactly the same as onthefly_zip_packer except +# pushed content is zipped before sending + +class SequentialTests(ImplementationBaseTests): + """Check proper behavior of AnotherBelovedPartner configuration""" + + def setUp(self): + super(SequentialTests, self).setUp() + + settings.CARRIER_PIGEON_PUSH_URLS = { + self.tested_configuration_name: ( + "dummy://user:pwd@ftp.belovedpartner.org", + ), + } + + # create Photo instance + + # build a random filename + m = hashlib.sha1() + m.update(os.urandom(24)) + filepath = '/tmp/%s.jpeg' % m.hexdigest() + # open and write photo filename with data + fd = open(filepath, 'w') + fd.write('coucou') + fd.close() + fd = open(filepath) + # create Photo object + photo = Photo( + title='Egg', + credits='Chicken', + caption='An egg created by a chicken', + original_file=File(fd), + ) + photo.save() + + # don't forget to clean + os.remove(filepath) + + # build story objects + self.stories = [] + + # the following two stories will be selected + # by BelovedPartner configuration + story = Story( + title='An egg & and a chicken', + workflow_state=Story.WORKFLOW_STATE.ONLINE, + content='a'*500, + photo=photo, + updating_date=date(2012, 5, 2), + ) + story.save() + self.stories.append(story) + story = Story( + title='The dear and the fawn ', + workflow_state=Story.WORKFLOW_STATE.ONLINE, + content='a'*500, + photo=photo, + updating_date=date(2012, 5, 2), + ) + story.save() + self.stories.append(story) + + # This story is not selected + story = Story( + title='Tazmania devil dog', + workflow_state=Story.WORKFLOW_STATE.OFFLINE, + content='a'*500, + photo=photo, + updating_date=date(2012, 5, 2), + ) + story.save() + + def _test_content(self): + for story in self.stories: + filename = 'NEWS_example_app_%s.xml' % story.pk + filepath = os.path.join( + self.outbox, + filename, + ) + with open(filepath) as f: + with open(self.data(filename)) as d: + self.assertEqual( + f.read(), + d.read(), + ) + + photopath = os.path.join( + self.outbox, + 'medias', + '1.jpg', + ) + self.assertTrue(os.path.exists(photopath)) + with open(photopath) as f: + self.assertEqual(f.read(), 'coucou') diff --git a/example_project/example_app/tests/sequential/flat_packer.py b/example_project/example_app/tests/sequential/flat_packer.py new file mode 100644 index 0000000..0dd6c48 --- /dev/null +++ b/example_project/example_app/tests/sequential/flat_packer.py @@ -0,0 +1,16 @@ +from example_app.tests.sequential.base import SequentialTests + +from django.core.management import call_command + + +# This is exactly the same as onthefly_zip_packer except +# pushed content is zipped before sending + +class BelovedPartnerTests(SequentialTests): + """Check proper behavior of BelovedPartner configuration""" + + tested_configuration_name = 'belovedpartner' + + def test_pigeon_push(self): + call_command('pigeon_push') + self._test_content() diff --git a/example_project/example_app/tests/sequential/zip_packer.py b/example_project/example_app/tests/sequential/zip_packer.py new file mode 100644 index 0000000..94ba92c --- /dev/null +++ b/example_project/example_app/tests/sequential/zip_packer.py @@ -0,0 +1,26 @@ +import os +import zipfile + +from example_app.tests.sequential.base import SequentialTests + +from django.core.management import call_command + + +class AnotherBelovedPartnerTests(SequentialTests): + """Check proper behavior of BelovedPartner configuration""" + + tested_configuration_name = 'anotherbelovedpartner' + + def test_pigeon_push(self): + call_command('pigeon_push') + listdir = os.listdir(self.outbox) + self.assertEqual(len(listdir), 2) + for filename in listdir: + # unzip file + path = os.path.join( + self.outbox, + filename, + ) + zzz = zipfile.ZipFile(path) + zzz.extractall(self.outbox) + self._test_content() diff --git a/example_project/medias/photo/2012/02/28/R0013040.jpg b/example_project/medias/photo/2012/02/28/R0013040.jpg deleted file mode 100755 index c4221e0..0000000 Binary files a/example_project/medias/photo/2012/02/28/R0013040.jpg and /dev/null differ diff --git a/example_project/medias/photo/2012/02/28/R0013040_1.jpg b/example_project/medias/photo/2012/02/28/R0013040_1.jpg deleted file mode 100755 index c4221e0..0000000 Binary files a/example_project/medias/photo/2012/02/28/R0013040_1.jpg and /dev/null differ diff --git a/example_project/medias/photo/2012/02/28/R0013040_2.jpg b/example_project/medias/photo/2012/02/28/R0013040_2.jpg deleted file mode 100755 index c4221e0..0000000 Binary files a/example_project/medias/photo/2012/02/28/R0013040_2.jpg and /dev/null differ diff --git a/example_project/settings.py b/example_project/settings.py index 31142ee..3fd46fd 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -167,8 +167,8 @@ CARRIER_PIGEON_OUTPUT_DIRECTORY = os.path.join(SITE_ROOT, 'tmp', 'export') CARRIER_PIGEON_MAX_PUSH_ATTEMPTS = 5 CARRIER_PIGEON_CLASSES = ( - "example_app.onthefly_rules.BelovedPartner", - "example_app.onthefly_rules.AnotherBelovedPartner", + "example_app.sequential_rules.BelovedPartner", + "example_app.sequential_rules.AnotherBelovedPartner", "example_app.mass_rules.WeeklyDigest", "example_app.mass_rules.FlatMassExport", ) diff --git a/example_project/templates/carrier_pigeon/anotherbelovedpartner/example_app_story.xml b/example_project/templates/carrier_pigeon/anotherbelovedpartner/example_app_story.xml new file mode 100644 index 0000000..87f579b --- /dev/null +++ b/example_project/templates/carrier_pigeon/anotherbelovedpartner/example_app_story.xml @@ -0,0 +1,21 @@ + +{% spaceless %} + {{ object.title }} + {{ object.updating_date|date }} + {{ object.content|striptags|linebreaks|safe }} + {% if object.photo %} + /medias/{{ object.photo.pk }}.jpg + {% else %} + + {% endif %} + {% if read_also %} + + {% for linked_story in read_also %} + + {{ linked_story.title }} + {{ linked_story.pk }} + + {% endfor %} + + {% endif %} +{% endspaceless %}