from cymysql.tests import base
import cymysql.cursors

import datetime


class TestDictCursor(base.PyMySQLTestCase):

    def test_DictCursor(self):
        # all assert test compare to the structure as would come out from MySQLdb
        conn = self.connections[0]
        c = conn.cursor(cymysql.cursors.DictCursor)
        # create a table ane some data to query
        c.execute("""CREATE TABLE dictcursor (name char(20), age int , DOB datetime)""")
        data = (("bob", 21, "1990-02-06 23:04:56"),
                ("jim", 56, "1955-05-09 13:12:45"),
                ("fred", 100, "1911-09-12 01:01:01"))
        bob = {'name': 'bob', 'age': 21, 'DOB': datetime.datetime(1990, 2, 6, 23, 4, 56)}
        jim = {'name': 'jim', 'age': 56, 'DOB': datetime.datetime(1955, 5, 9, 13, 12, 45)}
        fred = {'name': 'fred', 'age': 100, 'DOB': datetime.datetime(1911, 9, 12, 1, 1, 1)}
        try:
            c.executemany("insert into dictcursor values (%s,%s,%s)", data)
            # try an update which should return no rows
            c.execute("update dictcursor set age=20 where name='bob'")
            bob['age'] = 20
            # pull back the single row dict for bob and check
            c.execute("SELECT * from dictcursor where name='bob'")
            r = c.fetchone()
            self.assertEqual(bob, r, "fetchone via DictCursor failed")
            # same again, but via fetchall => tuple)
            c.execute("SELECT * from dictcursor where name='bob'")
            r = c.fetchall()
            self.assertEqual((bob, ), r, "fetch a 1 row result via fetchall failed via DictCursor")
            # same test again but iterate over the
            c.execute("SELECT * from dictcursor where name='bob'")
            for r in c:
                self.assertEqual(bob, r, "fetch a 1 row result via iteration failed via DictCursor")
            # get all 3 row via fetchall
            c.execute("SELECT * from dictcursor")
            r = c.fetchall()
            self.assertEqual((bob, jim, fred), r, "fetchall failed via DictCursor")
            # same test again but do a list comprehension
            c.execute("SELECT * from dictcursor")
            r = [x for x in c]
            self.assertEqual([bob, jim, fred], r, "list comprehension failed via DictCursor")
            # get all 2 row via fetchmany
            c.execute("SELECT * from dictcursor")
            r = c.fetchmany(2)
            self.assertEqual((bob, jim), r, "fetchmany failed via DictCursor")
        finally:
            c.execute("drop table dictcursor")


__all__ = ["TestDictCursor"]

if __name__ == "__main__":
    import unittest
    unittest.main()
