def setUp(self):

        super(ProxyPrincipalDBPostgreSQL, self).setUp()
        self.db = ProxyPostgreSQLDB(host="localhost", database="proxies")
        yield self.db.clean()
class ProxyPrincipalDBPostgreSQL(twistedcaldav.test.util.TestCase):
    """
    Directory service provisioned principals.
    """
    @inlineCallbacks
    def setUp(self):

        super(ProxyPrincipalDBPostgreSQL, self).setUp()
        self.db = ProxyPostgreSQLDB(host="localhost", database="proxies")
        yield self.db.clean()

    @inlineCallbacks
    def tearDown(self):
        yield self.db.close()
        self.db = None

    @inlineCallbacks
    def test_normalDB(self):

        # Get the DB
        yield self.db.clean()

        calendaruserproxy.ProxyDBService = self.db
        loader = XMLCalendarUserProxyLoader(
            "/Volumes/Data/Users/cyrusdaboo/Documents/Development/Apple/eclipse/CalendarServer-3/conf/auth/proxies-test.xml"
        )
        yield loader.updateProxyDB()

        yield self.db.setGroupMembers("A", (
            "B",
            "C",
            "D",
        ))

        membersA = yield self.db.getMembers("A")
        membershipsB = yield self.db.getMemberships("B")

        self.assertEqual(membersA, set((
            "B",
            "C",
            "D",
        )))
        self.assertEqual(membershipsB, set(("A", )))

    @inlineCallbacks
    def test_DBIndexed(self):

        # Get the DB
        yield self.db.clean()
        self.assertTrue((yield self.db.queryOne(
            "select hasindexes from pg_tables where tablename = 'groups'")))

    @inlineCallbacks
    def test_cachingDBInsert(self):

        for processType in (
                "Single",
                "Combined",
        ):
            config.ProcessType = processType

            # Get the DB
            yield self.db.clean()

            # Do one insert and check the result
            yield self.db.setGroupMembers("A", (
                "B",
                "C",
                "D",
            ))

            membersA = yield self.db.getMembers("A")
            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")
            membershipsE = yield self.db.getMemberships("E")

            self.assertEqual(membersA, set((
                "B",
                "C",
                "D",
            )))
            self.assertEqual(membershipsB, set(("A", )))
            self.assertEqual(membershipsC, set(("A", )))
            self.assertEqual(membershipsD, set(("A", )))
            self.assertEqual(membershipsE, set(()))

            # Change and check the result
            yield self.db.setGroupMembers("A", (
                "B",
                "C",
                "E",
            ))

            membersA = yield self.db.getMembers("A")
            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")
            membershipsE = yield self.db.getMemberships("E")

            self.assertEqual(membersA, set((
                "B",
                "C",
                "E",
            )))
            self.assertEqual(membershipsB, set(("A", )))
            self.assertEqual(membershipsC, set(("A", )))
            self.assertEqual(membershipsD, set())
            self.assertEqual(membershipsE, set(("A", )))

    @inlineCallbacks
    def test_cachingDBRemove(self):

        for processType in (
                "Single",
                "Combined",
        ):
            config.ProcessType = processType

            # Get the DB
            yield self.db.clean()

            # Do one insert and check the result
            yield self.db.setGroupMembers("A", (
                "B",
                "C",
                "D",
            ))
            yield self.db.setGroupMembers("X", (
                "B",
                "C",
            ))

            membersA = yield self.db.getMembers("A")
            membersX = yield self.db.getMembers("X")
            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")

            self.assertEqual(membersA, set((
                "B",
                "C",
                "D",
            )))
            self.assertEqual(membersX, set((
                "B",
                "C",
            )))
            self.assertEqual(membershipsB, set((
                "A",
                "X",
            )))
            self.assertEqual(membershipsC, set((
                "A",
                "X",
            )))
            self.assertEqual(membershipsD, set(("A", )))

            # Remove and check the result
            yield self.db.removeGroup("A")

            membersA = yield self.db.getMembers("A")
            membersX = yield self.db.getMembers("X")
            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")

            self.assertEqual(membersA, set())
            self.assertEqual(membersX, set((
                "B",
                "C",
            )))
            self.assertEqual(membershipsB, set("X", ))
            self.assertEqual(membershipsC, set("X", ))
            self.assertEqual(membershipsD, set())

    @inlineCallbacks
    def test_cachingDBRemoveSpecial(self):

        for processType in (
                "Single",
                "Combined",
        ):
            config.ProcessType = processType

            # Get the DB
            yield self.db.clean()

            # Do one insert and check the result
            yield self.db.setGroupMembers("A", (
                "B",
                "C",
                "D",
            ))
            yield self.db.setGroupMembers("X", (
                "B",
                "C",
            ))

            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")

            # Remove and check the result
            yield self.db.removeGroup("A")

            membersA = yield self.db.getMembers("A")
            membersX = yield self.db.getMembers("X")
            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")

            self.assertEqual(membersA, set())
            self.assertEqual(membersX, set((
                "B",
                "C",
            )))
            self.assertEqual(membershipsB, set("X", ))
            self.assertEqual(membershipsC, set("X", ))
            self.assertEqual(membershipsD, set())

    @inlineCallbacks
    def test_cachingDBRemovePrincipal(self):

        for processType in (
                "Single",
                "Combined",
        ):
            config.ProcessType = processType

            # Get the DB
            yield self.db.clean()

            # Do one insert and check the result
            yield self.db.setGroupMembers("A", (
                "B",
                "C",
                "D",
            ))
            yield self.db.setGroupMembers("X", (
                "B",
                "C",
            ))

            membersA = yield self.db.getMembers("A")
            membersX = yield self.db.getMembers("X")
            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")

            self.assertEqual(membersA, set((
                "B",
                "C",
                "D",
            )))
            self.assertEqual(membersX, set((
                "B",
                "C",
            )))
            self.assertEqual(membershipsB, set((
                "A",
                "X",
            )))
            self.assertEqual(membershipsC, set((
                "A",
                "X",
            )))
            self.assertEqual(membershipsD, set(("A", )))

            # Remove and check the result
            yield self.db.removePrincipal("B")

            membersA = yield self.db.getMembers("A")
            membersX = yield self.db.getMembers("X")
            membershipsB = yield self.db.getMemberships("B")
            membershipsC = yield self.db.getMemberships("C")
            membershipsD = yield self.db.getMemberships("D")

            self.assertEqual(membersA, set((
                "C",
                "D",
            )))
            self.assertEqual(membersX, set(("C", )))
            self.assertEqual(membershipsB, set())
            self.assertEqual(membershipsC, set((
                "A",
                "X",
            )))
            self.assertEqual(membershipsD, set(("A", ), ))

    @inlineCallbacks
    def test_cachingDBInsertUncached(self):

        for processType in (
                "Single",
                "Combined",
        ):
            config.ProcessType = processType

            # Get the DB
            yield self.db.clean()

            # Do one insert and check the result for the one we will remove
            yield self.db.setGroupMembers("AA", (
                "BB",
                "CC",
                "DD",
            ))
            yield self.db.getMemberships("DD")

            # Change and check the result
            yield self.db.setGroupMembers("AA", (
                "BB",
                "CC",
                "EE",
            ))

            membersAA = yield self.db.getMembers("AA")
            membershipsBB = yield self.db.getMemberships("BB")
            membershipsCC = yield self.db.getMemberships("CC")
            membershipsDD = yield self.db.getMemberships("DD")
            membershipsEE = yield self.db.getMemberships("EE")

            self.assertEqual(membersAA, set((
                "BB",
                "CC",
                "EE",
            )))
            self.assertEqual(membershipsBB, set(("AA", )))
            self.assertEqual(membershipsCC, set(("AA", )))
            self.assertEqual(membershipsDD, set())
            self.assertEqual(membershipsEE, set(("AA", )))