iro/tests/smstrade.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 30 Mar 2012 15:55:44 +0200
branchdevel
changeset 269 0d134b173cb1
parent 231 3929338fd17f
child 294 0e75bd39767d
permissions -rw-r--r--
iro.config: using OrderedDict instead of Dict + List for Options.

from twisted.trial import unittest
from decimal import Decimal
from mock import patch, Mock

from iro.error import NoRoute, NoTyp, NeededOption, RejectRecipient
from iro.telnumber import Telnumber
from iro.model.message import SMS
from iro.offer.smstrade import Smstrade, SmstradeException, StatusCode


HOST = "localhost"
PORT = 9999

class TestSMStradeProvider(unittest.TestCase):

    def getProvider(self, c=None):
        _c={"key":"XXXXXXXX",
            "typ":"smstrade",
            }

        if c:
            _c.update(c)

        ret = Smstrade("test")
        ret.load(_c.items())
        return ret

    @patch("urllib.urlopen")
    def testSendSMS(self,mock_urlopen):
        f = Mock()
        f.readlines.return_value = ["100","12345678","0.055","1"]
        mock_urlopen.return_value = f

        params = ["key=XXXXXXXX","to=00491701234567", "message=Hello+World", "route=gold", "message_id=1", "cost=1","count=1",'charset=utf-8']
        params.sort()
        
        p=self.getProvider()
        content = "Hello World"
        r = p.send("gold", Telnumber("01701234567"), SMS(content,None))

        ca = mock_urlopen.call_args[0]
        c=ca[1].split("&")
        c.sort()
        
        self.assertEqual(ca[0],"https://gateway.smstrade.de")
        self.assertEqual(c,params)
        self.assertEqual(f.readlines.call_count,1)

        self.assertEqual(r.provider, p)
        self.assertEqual(r.route, 'gold')
        self.assertEqual(r.costs, Decimal('0.055'))
        self.assertEqual(r.exID, '12345678')
        self.assertEqual(r.count, 1)

    def testStatusCode(self):
        s = StatusCode(10,"12345678","1.10",1)
        self.assertEqual(str(s),'10: Empfaengernummer nicht korrekt.')
        self.assertEqual(int(s),10)
        self.assertEqual(s.count,1)
        self.assertEqual(s.costs,Decimal("1.10"))
        self.assertEqual(s.exID,'12345678')


    def testUnknownStatusCode(self):
        s = StatusCode(999)
        self.assertEqual(str(s),'999: unknown statuscode.')
        self.assertEqual(int(s),999)
        self.assertEqual(s.count,0)
        self.assertEqual(s.costs,Decimal("0.00"))
        self.assertEqual(s.exID, None)



    def testRejectRecipient(self):
        p=self.getProvider()
        content = "Hello World"
        e = self.assertRaises(RejectRecipient, p.send, "basic", Telnumber("+331701234567"), SMS(content,None))
        self.assertEqual(str(e),'Reject recipient(00331701234567): None')

    @patch("urllib.urlopen")
    def testRejectRecipient70(self,mock_urlopen):
        f = Mock()
        f.readlines.return_value = ["70"]
        mock_urlopen.return_value = f

        p=self.getProvider()
        content = "Hello World"
        self.assertRaises(RejectRecipient, p.send , "basic", Telnumber("01701234567") ,SMS(content,None))

        f.readlines.return_value = ["71"]
        e = self.assertRaises(RejectRecipient, p.send , "basic", Telnumber("01701234567"), SMS(content,None))
        self.assertEqual(str(e),'Reject recipient(00491701234567): 71: Feature nicht ueber diese Route moeglich.')

    @patch("urllib.urlopen")
    def testUnknwonStatuscode(self,mock_urlopen):
        f = Mock()
        f.readlines.return_value = ["703"]
        mock_urlopen.return_value = f

        p=self.getProvider()
        content = "Hello World"
        e = self.assertRaises(SmstradeException, p.send , "basic", Telnumber("01701234567"), SMS(content,None))
        self.assertEqual(str(e),'950: Error in external API.\n703: unknown statuscode.')

    @patch("urllib.urlopen")
    def testSmstradeException(self,mock_urlopen):
        f = Mock()
        f.readlines.return_value = ["10"]
        mock_urlopen.return_value = f

        p=self.getProvider()
        content = "Hello World"
        e = self.assertRaises(SmstradeException, p.send , "basic", Telnumber("01701234567"), SMS(content,None))
        self.assertEqual(str(e),'950: Error in external API.\n10: Empfaengernummer nicht korrekt.')



    def testNeededOption(self):
        s= self.getProvider()
        self.assertEqual(s.key, "XXXXXXXX")

        self.assertRaises(NeededOption, s.load,[])

    def testSendFunc(self):
        s = self.getProvider()
        p = s.getSendFunc("sms","basic")
        self.assertEqual(p.func, s.send)
        self.assertEqual(p.args, ("basic",))
        self.assertRaises(NoRoute,s.getSendFunc,"sms","foo")
        self.assertRaises(NoTyp,s.getSendFunc,"mail2","basic")