"""
Test cases for ldaptor.protocols.ldap.autofill module.
"""

from twisted.trial import unittest
from ldaptor.protocols.ldap import ldapsyntax
from ldaptor.testutil import LDAPClientTestDriver


class Autofill_sum:  # TODO baseclass
    def __init__(self, resultAttr, sumAttrs):
        self.resultAttr = resultAttr
        self.sumAttrs = sumAttrs

    def start(self, ldapObject):
        pass

    def notify(self, ldapObject, attributeType):
        if attributeType not in self.sumAttrs:
            return

        sum = 0
        for sumAttr in self.sumAttrs:
            if sumAttr not in ldapObject:
                continue
            for val in ldapObject[sumAttr]:
                val = int(val)
                sum += val
        sum = str(sum)
        ldapObject[self.resultAttr] = [sum]


class LDAPAutoFill_Simple(unittest.TestCase):
    def testSimpleSum(self):
        """A simple autofiller that calculates sums of attributes should work.."""
        client = LDAPClientTestDriver()
        o = ldapsyntax.LDAPEntryWithAutoFill(
            client=client,
            dn="cn=foo,dc=example,dc=com",
            attributes={
                "objectClass": ["some", "other"],
            },
        )
        d = o.addAutofiller(Autofill_sum(resultAttr="sum", sumAttrs=["a", "b"]))

        def cb(dummy):
            client.assertNothingSent()

            o["a"] = ["1"]
            o["b"] = ["2", "3"]

            self.failUnless("sum" in o)
            self.failUnlessEqual(o["sum"], ["6"])

        d.addCallback(cb)
        return d
