diff --git a/.travis.yml b/.travis.yml index 324e544..411f770 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,15 @@ -services: - - redis-server - -language: python - python: - '3.5' - '3.6' - '3.7-dev' + +services: + - redis-server + - docker + +language: python + addons: sauce_connect: username: synhack @@ -16,6 +18,12 @@ addons: cache: pip +before_install: + - docker build -t mercure . + - docker run -d --name redis redis + - docker run -d --name mercure --link=redis:redis -e 'SECRET_KEY=unit_test' mercure + - docker exec -i mercure python manage.py test --exclude-tag selenium + install: - pip install -r requirements.txt - pip install coveralls diff --git a/mercure/settings/base.py b/mercure/settings/base.py index 2c8cad7..5fd30a2 100644 --- a/mercure/settings/base.py +++ b/mercure/settings/base.py @@ -164,14 +164,12 @@ 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], - 'PAGE_SIZE': 10, } CACHES = { 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': '%s:%s' % (os.environ.get('REDIS_HOST', 'localhost'), - os.environ.get('REDIS_PORT', '6379')), + 'LOCATION': os.environ.get('REDIS_PORT', 'tcp://localhost:6379'), }, } @@ -179,4 +177,4 @@ 'default': { 'USE_REDIS_CACHE': 'default', }, -} +} \ No newline at end of file diff --git a/mercure/settings/prod.py b/mercure/settings/prod.py index c7b796a..04d25a0 100644 --- a/mercure/settings/prod.py +++ b/mercure/settings/prod.py @@ -31,8 +31,7 @@ CACHES = { 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': '%s:%s' % (os.environ.get('REDIS_HOST', 'redis'), - os.environ.get('REDIS_PORT', '6379')), + 'LOCATION': os.environ.get('REDIS_PORT', 'tcp://redis:6379'), }, } diff --git a/phishing/models/campaign.py b/phishing/models/campaign.py index cbc777b..555ddaf 100644 --- a/phishing/models/campaign.py +++ b/phishing/models/campaign.py @@ -59,9 +59,8 @@ def __str__(self): @property def is_launched(self): - if self.send_at < now(): - return True - return False + return self.trackers.count() > 0 + # TODO: sortir la conf smtp => faire un model # diff --git a/phishing/tests/campaign.py b/phishing/tests/campaign.py index 06f5e4f..ab2a39e 100644 --- a/phishing/tests/campaign.py +++ b/phishing/tests/campaign.py @@ -415,6 +415,7 @@ def test_dashboard_campaign_with_minimize_url(self): self.run_jobs() # check minified url + self.assertGreater(len(mail.outbox), 0, mail.outbox) self.assertIn('click: http://tinyurl.com/', str(mail.outbox[-1].message())) diff --git a/phishing/tests/landing_page.py b/phishing/tests/landing_page.py index 0ea0af7..2edaea2 100644 --- a/phishing/tests/landing_page.py +++ b/phishing/tests/landing_page.py @@ -437,6 +437,7 @@ def test_landing_page_view_invalid_post_id(self): # We go to the landing page # The HTTP_HOST is mandatory to generate form "action" tracker = camp.trackers.filter(key='landing_page_open').first() + self.assertIsNotNone(tracker) resp = self.client.get( reverse('landing_page', args=(tracker.uuid,)), HTTP_HOST='foo.com') @@ -474,6 +475,7 @@ def test_landing_page_view_exception(self): tracker = camp.trackers.filter(key='landing_page_open').first() # set incorrect value for make crash + self.assertIsNotNone(tracker) tracker.campaign_id = 99999999 tracker.save() @@ -521,6 +523,7 @@ def test_landing_page_post(self): 'mercure_real_action_url': 'http://foo.com', 'mercure_redirect_url': target } + self.assertIsNotNone(tracker_post) resp = self.client.post(reverse('landing_page_post', args=(tracker_post.pk,)), data=data) self.assertEqual(resp.status_code, 200) diff --git a/phishing/tests/signal.py b/phishing/tests/signal.py index 525d134..2869880 100644 --- a/phishing/tests/signal.py +++ b/phishing/tests/signal.py @@ -140,6 +140,7 @@ def handler(request, landing_page, **kwarg): campaign.target_groups.add(target_group) self.run_jobs() + self.assertGreater(len(mail.outbox), 0, mail.outbox) landing_page_url = mail.outbox[-1].body.split('<')[0] # call landing page ans test result @@ -240,6 +241,7 @@ def handler(email_template, **kwarg): campaign.target_groups.add(target_group) self.run_jobs() + self.assertGreater(len(mail.outbox), 0, mail.outbox) self.assertEqual(mail.outbox[-1].body, 'Hello!') mail_html = mail.outbox[-1].alternatives[0][0] self.assertEqual(mail_html.split('<')[0], 'Hi!') @@ -306,6 +308,7 @@ def handler(instance, **kwarg): # call tracker self.send_campaign() + self.assertGreater(len(mail.outbox), 0, mail.outbox) attachment = json.loads(mail.outbox[-1].attachments[0][1].decode()) tracker_url = attachment['tracker_url'] @@ -333,6 +336,7 @@ def handler(instance, **kwarg): # call tracker self.send_campaign() + self.assertGreater(len(mail.outbox), 0, mail.outbox) attachment = json.loads(mail.outbox[-1].attachments[0][1].decode()) tracker_url = attachment['tracker_url'] @@ -359,6 +363,7 @@ def handler(instance, **kwarg): # call tracker self.send_campaign() + self.assertGreater(len(mail.outbox), 0, mail.outbox) mail_html = mail.outbox[-1].alternatives[0][0] tracker_url = mail_html.split('src="')[-1].split('"')[0] @@ -386,6 +391,7 @@ def handler(instance, **kwarg): # call tracker self.send_campaign() + self.assertGreater(len(mail.outbox), 0, mail.outbox) tracker_url = mail.outbox[-1].body # test if handler has call @@ -446,6 +452,7 @@ def handler(instance, **kwarg): # call tracker self.send_campaign() + self.assertGreater(len(mail.outbox), 0, mail.outbox) tracker_url = mail.outbox[-1].body # call landing page diff --git a/phishing/tests/user.py b/phishing/tests/user.py index e9fd813..7c86297 100644 --- a/phishing/tests/user.py +++ b/phishing/tests/user.py @@ -3,11 +3,13 @@ from django.urls import reverse from django.test import TestCase -from phishing.models import Campaign, EmailTemplate +from phishing.models import Campaign, EmailTemplate, TargetGroup, Target +from .helpers import RQMixin -class PermissionTestCase(TestCase): +class PermissionTestCase(RQMixin, TestCase): def setUp(self): + super(PermissionTestCase, self).setUp() self.client.get('not-found') # django fix: first client call is 404 def test_default_permission(self): @@ -36,6 +38,12 @@ def test_default_permission(self): Campaign.objects.create(name='test 2', **campaign_infos) Campaign.objects.create(name='test 3', **campaign_infos) + # send campaign + target_group = TargetGroup.objects.create(name='targets') + Target.objects.create(email='test@test.com', group=target_group) + campaign.target_groups.add(target_group) + self.run_jobs() + # can list campaign response = self.client.get(reverse('campaign_list')) content = response.content.decode()