Skip to content

Commit

Permalink
Tests + code formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
folix-01 committed Jul 21, 2023
1 parent 24ac774 commit 8dbfe13
Show file tree
Hide file tree
Showing 8 changed files with 299 additions and 35 deletions.
17 changes: 13 additions & 4 deletions src/redturtle/prenotazioni/adapters/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -162,11 +162,20 @@
<!-- Prenotazione email message adapters -->


<adapter factory=".prenotazione_email_message.PrenotazioneAfterTransitionEmailMessage" name="reject" />
<adapter factory=".prenotazione_email_message.PrenotazioneAfterTransitionEmailMessage" name="submit" />
<adapter factory=".prenotazione_email_message.PrenotazioneAfterTransitionEmaiICallMessage" name="confirm" />
<adapter
factory=".prenotazione_email_message.PrenotazioneAfterTransitionEmailMessage"
name="refuse"
/>
<adapter
factory=".prenotazione_email_message.PrenotazioneAfterTransitionEmailMessage"
name="submit"
/>
<adapter
factory=".prenotazione_email_message.PrenotazioneAfterTransitionEmaiICallMessage"
name="confirm"
/>

<!-- Prenotazione moved event message adapter -->
<adapter factory=".prenotazione_email_message.PrenotazioneMovedICallEmailMessage"/>
<adapter factory=".prenotazione_email_message.PrenotazioneMovedICallEmailMessage" />

</configure>
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
"""In this module we implemented the booking email templates which were used
by plone contenttrules in previous verisions of the package"""

Expand All @@ -15,7 +16,6 @@
from plone.stringinterp.interfaces import IStringInterpolator
from plone.event.interfaces import IICalendar

from redturtle.prenotazioni import _
from redturtle.prenotazioni.interfaces import IPrenotazioneEmailMessage
from redturtle.prenotazioni.prenotazione_event import IMovedPrenotazione
from redturtle.prenotazioni.content.prenotazione import IPrenotazione
Expand Down Expand Up @@ -117,7 +117,7 @@ def message_subject(self) -> str:
return IStringInterpolator(IContextWrapper(self.prenotazione)())(
getattr(
self.folder,
f"notify_on_moved_subject",
"notify_on_move_subject",
"",
)
)
Expand All @@ -129,7 +129,7 @@ def message_text(self) -> MIMEText:
getattr(
getattr(
self.folder,
f"notify_on_moved_message",
"notify_on_move_message",
None,
),
"output",
Expand Down
9 changes: 4 additions & 5 deletions src/redturtle/prenotazioni/content/prenotazioni_folder.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
from z3c.form import validator
from z3c.form.browser.checkbox import CheckBoxFieldWidget
from zope import schema
from zope.i18n import translate
from zope.component import provideAdapter
from zope.interface import implementer
from zope.interface import Interface
Expand Down Expand Up @@ -497,7 +496,7 @@ def data_validation(data):
"notify_on_submit_help",
default="Notify via mail the user when his booking has been created. If auto-confirm flag is selected and confirm notify is selected, this one will be ignored.",
),
default=True,
default=False,
required=False,
)
notify_on_confirm = schema.Bool(
Expand All @@ -506,7 +505,7 @@ def data_validation(data):
"notify_on_confirm_help",
default="Notify via mail the user when his booking has been confirmed.",
),
default=True,
default=False,
required=False,
)
notify_on_move = schema.Bool(
Expand All @@ -515,7 +514,7 @@ def data_validation(data):
"notify_on_move_help",
default="Notify via mail the user when his booking has been moved.",
),
default=True,
default=False,
required=False,
)
notify_on_reject = schema.Bool(
Expand All @@ -524,7 +523,7 @@ def data_validation(data):
"notify_on_reject_help",
default="Notify via mail the user when his booking has been rejected.",
),
default=True,
default=False,
required=False,
)
form.mode(templates_usage="display")
Expand Down
6 changes: 6 additions & 0 deletions src/redturtle/prenotazioni/events/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,11 @@
Products.CMFCore.interfaces.IActionSucceededEvent"
handler=".prenotazione.autoconfirm"
/>
<subscriber
for="redturtle.prenotazioni.content.prenotazione.IPrenotazione
redturtle.prenotazioni.prenotazione_event.IMovedPrenotazione"
handler=".prenotazione.notify_on_move"
/>


</configure>
4 changes: 4 additions & 0 deletions src/redturtle/prenotazioni/profiles/default/contentrules.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0"?>
<contentrules>

</contentrules>
252 changes: 252 additions & 0 deletions src/redturtle/prenotazioni/tests/test_prenotazione_events.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
# -*- coding: UTF-8 -*-
import email
import unittest

from datetime import date, datetime
from datetime import timedelta

from zope.event import notify
from zope.interface import implementer
from zope.interface.interfaces import IObjectEvent
from plone import api
from plone.app.testing import setRoles
from plone.app.testing import TEST_USER_ID
from plone.app.textfield.value import RichTextValue

from redturtle.prenotazioni.adapters.booker import IBooker
from redturtle.prenotazioni.prenotazione_event import MovedPrenotazione
from redturtle.prenotazioni.testing import (
REDTURTLE_PRENOTAZIONI_FUNCTIONAL_TESTING,
)


@implementer(IObjectEvent)
class DummyEvent(object):
def __init__(self, object):
self.object = object


class TestSendIcal(unittest.TestCase):
layer = REDTURTLE_PRENOTAZIONI_FUNCTIONAL_TESTING

def setUp(self):
self.app = self.layer["app"]
self.portal = self.layer["portal"]
self.mailhost = self.portal.MailHost
self.email_subject = "Testing subject"
self.email_message = "Testing message"

setRoles(self.portal, TEST_USER_ID, ["Manager"])

self.folder_prenotazioni = api.content.create(
container=self.portal,
type="PrenotazioniFolder",
title="Prenota foo",
description="",
daData=date.today(),
week_table=[
{
"day": "Lunedì",
"morning_start": "0700",
"morning_end": "1000",
"afternoon_start": None,
"afternoon_end": None,
},
{
"day": "Martedì",
"morning_start": "0700",
"morning_end": "1000",
"afternoon_start": None,
"afternoon_end": None,
},
{
"day": "Mercoledì",
"morning_start": "0700",
"morning_end": "1000",
"afternoon_start": None,
"afternoon_end": None,
},
{
"day": "Giovedì",
"morning_start": "0700",
"morning_end": "1000",
"afternoon_start": None,
"afternoon_end": None,
},
{
"day": "Venerdì",
"morning_start": "0700",
"morning_end": "1000",
"afternoon_start": None,
"afternoon_end": None,
},
{
"day": "Sabato",
"morning_start": "0700",
"morning_end": "1000",
"afternoon_start": None,
"afternoon_end": None,
},
{
"day": "Domenica",
"morning_start": "0700",
"morning_end": "1000",
"afternoon_start": None,
"afternoon_end": None,
},
],
booking_types=[
{"name": "Type A", "duration": "30"},
],
gates=["Gate A"],
)
self.today = datetime.now().replace(hour=8)
self.tomorrow = self.today + timedelta(1)

def create_booking(self):
booker = IBooker(self.folder_prenotazioni)
return booker.create(
{
"booking_date": self.tomorrow, # tomorrow
"booking_type": "Type A",
"title": "foo",
"email": "[email protected]",
}
)

def test_email_sent_on_submit(self):
self.folder_prenotazioni.notify_on_submit = True
self.folder_prenotazioni.notify_on_submit_subject = self.email_subject
self.folder_prenotazioni.notify_on_submit_message = RichTextValue(
self.email_message, "text/html", "text/html"
)

self.assertFalse(self.mailhost.messages)

self.create_booking()

self.assertEqual(len(self.mailhost.messages), 1)

mail = email.message_from_bytes(self.mailhost.messages[0])

self.assertTrue(mail.is_multipart())

self.assertIn(
self.email_subject,
"".join([i for i in mail.values()]),
)
self.assertIn(
self.email_message,
mail.get_payload()[0].get_payload(),
)

def test_email_send_on_confirm(self):
self.folder_prenotazioni.notify_on_confirm = True
self.folder_prenotazioni.notify_on_confirm_subject = self.email_subject
self.folder_prenotazioni.notify_on_confirm_message = RichTextValue(
self.email_message, "text/html", "text/html"
)

self.assertFalse(self.mailhost.messages)

booking = self.create_booking()

api.content.transition(booking, "confirm")

self.assertEqual(len(self.mailhost.messages), 1)

mail = email.message_from_bytes(self.mailhost.messages[0])

self.assertTrue(mail.is_multipart())

self.assertIn(
self.email_subject,
"".join([i for i in mail.values()]),
)
self.assertIn(
self.email_message,
mail.get_payload()[0].get_payload(),
)

def test_email_send_on_reject(self):
self.folder_prenotazioni.notify_on_refuse = True
self.folder_prenotazioni.notify_on_refuse_subject = self.email_subject
self.folder_prenotazioni.notify_on_refuse_message = RichTextValue(
self.email_message, "text/html", "text/html"
)

self.assertFalse(self.mailhost.messages)

booking = self.create_booking()

api.content.transition(booking, "refuse")

self.assertEqual(len(self.mailhost.messages), 1)

mail = email.message_from_bytes(self.mailhost.messages[0])

self.assertTrue(mail.is_multipart())

self.assertIn(
self.email_subject,
"".join([i for i in mail.values()]),
)
self.assertIn(
self.email_message,
mail.get_payload()[0].get_payload(),
)

def test_email_not_sent_on_submit_if_on_confirm_true(self):
self.folder_prenotazioni.notify_on_submit = True
self.folder_prenotazioni.notify_on_confirm = True
self.folder_prenotazioni.notify_on_confirm_subject = self.email_subject
self.folder_prenotazioni.notify_on_confirm_message = RichTextValue(
self.email_message, "text/html", "text/html"
)

self.assertFalse(self.mailhost.messages)

booking = self.create_booking()

api.content.transition(booking, "confirm")

self.assertEqual(len(self.mailhost.messages), 1)

mail = email.message_from_bytes(self.mailhost.messages[0])

self.assertTrue(mail.is_multipart())

self.assertIn(
self.email_subject,
"".join([i for i in mail.values()]),
)
self.assertIn(
self.email_message,
mail.get_payload()[0].get_payload(),
)

def test_email_send_on_prenotazione_move(self):
self.folder_prenotazioni.notify_on_move = True
self.folder_prenotazioni.notify_on_move_subject = self.email_subject
self.folder_prenotazioni.notify_on_move_message = RichTextValue(
self.email_message, "text/html", "text/html"
)

self.assertFalse(self.mailhost.messages)

notify(MovedPrenotazione(self.create_booking()))

self.assertEqual(len(self.mailhost.messages), 1)

mail = email.message_from_bytes(self.mailhost.messages[0])

self.assertTrue(mail.is_multipart())

self.assertIn(
self.email_subject,
"".join([i for i in mail.values()]),
)
self.assertIn(
self.email_message,
mail.get_payload()[0].get_payload(),
)
10 changes: 8 additions & 2 deletions src/redturtle/prenotazioni/tests/test_send_ical.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# -*- coding: UTF-8 -*-
from collective.contentrules.mailfromfield.actions.mail import MailFromFieldAction
# TODO: Evaluate if we can join the prenotazioni event tests with the tests below so
# as now the ical is being added in the templates adaptes used py plone event
from collective.contentrules.mailfromfield.actions.mail import (
MailFromFieldAction,
)
from datetime import date, datetime
from datetime import timedelta
from plone import api
Expand All @@ -9,7 +13,9 @@
from Products.CMFCore.WorkflowCore import ActionSucceededEvent
from redturtle.prenotazioni.adapters.booker import IBooker
from redturtle.prenotazioni.prenotazione_event import MovedPrenotazione
from redturtle.prenotazioni.testing import REDTURTLE_PRENOTAZIONI_FUNCTIONAL_TESTING
from redturtle.prenotazioni.testing import (
REDTURTLE_PRENOTAZIONI_FUNCTIONAL_TESTING,
)
from zope.component import getMultiAdapter
from zope.interface import implementer
from zope.interface.interfaces import IObjectEvent
Expand Down
Loading

0 comments on commit 8dbfe13

Please sign in to comment.