Utility
=======

Initial imports and defines
----------------------------

    >>> from zope.component import getUtility, provideUtility

IAuthCode
---------
    >>> from collective.pfg.payment.interfaces import IAuthCode
    >>> from collective.pfg.payment.utility.miscellaneous import AuthCode
    >>> provideUtility(AuthCode(), provides=IAuthCode)
    >>> ac = getUtility(IAuthCode)
    >>> ac
    <collective.pfg.payment.utility.miscellaneous.AuthCode object at ...>

    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> m.update('a')
    >>> m.hexdigest()
    '0cc175b9c0f1b6a831c399e269772661'
    >>> m.update('b')
    >>> m.hexdigest()
    '187ef4436122d1cc2f40dc2b92f0eba0'
    >>> try:
    ...     import hashlib
    ...     n = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     n = md5.new()
    >>> n.update('ab')
    >>> n.hexdigest()
    '187ef4436122d1cc2f40dc2b92f0eba0'
    >>> m.hexdigest() == n.hexdigest()
    True

    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> m.update('')
    >>> m.hexdigest()
    'd41d8cd98f00b204e9800998ecf8427e'
    >>> ac()
    'd41d8cd98f00b204e9800998ecf8427e'
    >>> m.hexdigest() == ac()
    True

    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> keys = ['abcd']
    >>> key = ''.join(keys)
    >>> m.update(key)
    >>> m.hexdigest() == ac(keys=keys)
    True

    >>> code = 'zyx'
    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> m.update(code)
    >>> m.update(key)
    >>> m.hexdigest() == ac(keys=keys, code=code)
    True

    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> m.update(code)
    >>> key = '|abcd'
    >>> m.update(key)
    >>> m.hexdigest()
    '309f224ae1ef5cae5e862000f4dee952'

    >>> key = '|efgh'
    >>> m.update(key)
    >>> keys = ['abcd', 'efgh']
    >>> m.hexdigest() == ac(keys=keys, code=code, separator='|')
    True
    >>> upper = m.hexdigest().upper()
    >>> upper
    '649B4AA40D05F921EB81469379A1C35F'
    >>> ac(keys=keys, code=code, separator='|', capital=True)
    '649B4AA40D05F921EB81469379A1C35F'
    >>> upper == ac(keys=keys, code=code, separator='|', capital=True)
    True

#    '649b4aa40d05f921eb81469379a1c35f'
#    >>> keys = ['abcd', 'efgh']
#    >>> ac(keys=keys, code=code, separator='|') == 
#    True

    >>> CODE = '6pKF4jkv97zmqBJ3ZL8gUw5DfT2NMQ'
    >>> MERCHANT_ID = '13466'
    >>> AMOUNT = '1'
    >>> ORDER_NUMBER = '1'
    >>> ORDER_DESCRIPTION = 'taito.horiuchi@gmail.com,t,t,1'
    >>> CURRENCY = 'EUR'
    >>> RETURN_ADDRESS = 'http://localhost:8080/Plone/form-folder/@@verkkomaksut-success'
    >>> CANCEL_ADDRESS = 'http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-canceled'
    >>> NOTIFY_ADDRESS = 'http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-notify'
    >>> TYPE = 'S1'
    >>> CULTURE = 'fi_FI'
    >>> MODE = '1'
    >>> BLANK = ''
    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> m.update(CODE)
    >>> m.update('|' + MERCHANT_ID)
    >>> m.update('|' + AMOUNT)
    >>> m.update('|' + ORDER_NUMBER)
    >>> m.update('||' + ORDER_DESCRIPTION)
    >>> m.update('|' + CURRENCY)
    >>> m.update('|' + RETURN_ADDRESS)
    >>> m.update('|' + CANCEL_ADDRESS)
    >>> m.update('||' + NOTIFY_ADDRESS)
    >>> m.update('|' + TYPE)
    >>> m.update('|' + CULTURE)
    >>> m.update('||' + MODE + '||')
    >>> auth_code = m.hexdigest()
    >>> AUTHCODE = auth_code.upper()
    >>> AUTHCODE
    '91A9848AC8BCDF6D5A8EBDB5A041B00E'

    >>> nstring = CODE + '|' + MERCHANT_ID + '|' + AMOUNT + '|' + ORDER_NUMBER + '||' + ORDER_DESCRIPTION + '|' + CURRENCY + '|' + RETURN_ADDRESS + '|' + CANCEL_ADDRESS + '||' + NOTIFY_ADDRESS + '|' + TYPE + '|' + CULTURE + '||' + MODE + '||'
    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> m.update(nstring)
    >>> m.hexdigest().upper()
    '91A9848AC8BCDF6D5A8EBDB5A041B00E'
    >>> m.hexdigest().upper() == AUTHCODE
    True

    >>> nstring = CODE + '|' + MERCHANT_ID + '|' + AMOUNT + '|' + ORDER_NUMBER + '|' + BLANK + '|' + ORDER_DESCRIPTION + '|' + CURRENCY + '|' + RETURN_ADDRESS + '|' + CANCEL_ADDRESS + '|' + BLANK + '|' + NOTIFY_ADDRESS + '|' + TYPE + '|' + CULTURE + '|' + BLANK + '|' + MODE + '|' + BLANK + '|'
    >>> try:
    ...     import hashlib
    ...     m = hashlib.md5()
    ... except ImportError:
    ...     import md5
    ...     m = md5.new()
    >>> m.update(nstring)
    >>> m.hexdigest().upper()
    '91A9848AC8BCDF6D5A8EBDB5A041B00E'
    >>> m.hexdigest().upper() == AUTHCODE
    True

    >>> nstring
    '6pKF4jkv97zmqBJ3ZL8gUw5DfT2NMQ|13466|1|1||taito.horiuchi@gmail.com,t,t,1|EUR|http://localhost:8080/Plone/form-folder/@@verkkomaksut-success|http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-canceled||http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-notify|S1|fi_FI||1||'
    >>> ns = nstring.split('|')[1:]
    >>> ns
    ['13466', '1', '1', '', 'taito.horiuchi@gmail.com,t,t,1', 'EUR', 'http://localhost:8080/Plone/form-folder/@@verkkomaksut-success', 'http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-canceled', '', 'http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-notify', 'S1', 'fi_FI', '', '1', '', '']


#    >>> keys = [MERCHANT_ID, AMOUNT, ORDER_NUMBER, BLANK, ORDER_DESCRIPTION, CURRENCY, RETURN_ADDRESS, RETURN_ADDRESS, CANCEL_ADDRESS, BLANK, NOTIFY_ADDRESS, TYPE, CULTURE, BLANK, MODE, BLANK, BLANK]
#    >>> keys
#    ['13466', '1', '1', '', 'taito.horiuchi@gmail.com,t,t,1', 'EUR', 'http://localhost:8080/Plone/form-folder/@@verkkomaksut-success', 'http://localhost:8080/Plone/form-folder/@@verkkomaksut-success', 'http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-canceled', '', 'http://localhost:8080/Plone/form-folder/verkkomakust/@@verkkomaksut-notify', 'S1', 'fi_FI', '', '1', '', '']

    >>> keys = ns
    >>> ac(keys, code=CODE, separator='|', capital=True) == AUTHCODE
    True

IRegularEXpression
----
    >>> from collective.pfg.payment.interfaces import IRegularExpression
    >>> from collective.pfg.payment.utility.miscellaneous import RegularExpression
    >>> provideUtility(RegularExpression(), provides=IRegularExpression)
    >>> re = getUtility(IRegularExpression)
    >>> re.email('aaa')
    False
    >>> re.email('333')
    False
    >>> re.email('ggg@')
    False
    >>> re.email('a@a.com')
    True
    >>> re.integer('aaa')
    False
    >>> re.integer('5.5')
    False
    >>> re.integer('5')
    True
    >>> re.integer('50')
    True
    >>> re.float('aaa')
    False
    >>> re.float('5')
    True
    >>> re.float('5a5')
    False
    >>> re.float('50.55')
    True

IRandomDigits
----
    >>> from collective.pfg.payment.interfaces import IRandomDigits
    >>> from collective.pfg.payment.utility.miscellaneous import RandomDigits
    >>> provideUtility(RandomDigits(), provides=IRandomDigits)
    >>> rd = getUtility(IRandomDigits)
    >>> ids = ['6', '5', '4', '3', '2', '1', '0']
    >>> len(rd(4, None))
    4
    >>> rd(-1, ids)
    ''
    >>> rd(1, ids) in ['9', '8', '7']
    True
    >>> len(rd(2, ids))
    2
    >>> len(rd(10, ids))
    10
    >>> len(rd(2, []))
    2
    >>> ids = range(1,10)
    >>> ids = [str(id) for id in ids]
    >>> rd(1, ids)
    '0'
    >>> ids = range(1,11)
    >>> ids = [str(id) for id in ids]
    >>> len(ids)
    10
    >>> rd(1, ids)
    Traceback (most recent call last):
    ...
    InfiniteLoopError: All the numbers with digits 1 are used.

