from __future__ import absolute_import, print_function, division

import unittest
from foalorm.orm.sqlbuilding import SQLBuilder
from foalorm.orm.dbapiprovider import DBAPIProvider
from foalorm.orm.tests.testutils import TestPool


class TestFormatStyles(unittest.TestCase):
    def setUp(self):
        self.key1 = 'KEY1'
        self.key2 = 'KEY2'
        self.provider = DBAPIProvider(_database=None, foalorm_pool_mockup=TestPool(None))
        self.ast = [ 'SELECT', [ 'ALL', ['COLUMN', None, 'A']], [ 'FROM', [None, 'TABLE', 'T1']],
                     [ 'WHERE', [ 'EQ', ['COLUMN', None, 'B'], [ 'PARAM', self.key1 ] ],
                              [ 'EQ', ['COLUMN', None, 'C'], [ 'PARAM', self.key2 ] ],
                              [ 'EQ', ['COLUMN', None, 'D'], [ 'PARAM', self.key2 ] ],
                              [ 'EQ', ['COLUMN', None, 'E'], [ 'PARAM', self.key1 ] ]
                     ]
                   ]
    def test_qmark(self):
        self.provider.paramstyle = 'qmark'
        b = SQLBuilder(self.provider, self.ast)
        self.assertEqual(b.sql, 'SELECT "A"\n'
                                'FROM "T1"\n'
                                'WHERE "B" = ?\n  AND "C" = ?\n  AND "D" = ?\n  AND "E" = ?')
        self.assertEqual(b.layout, [self.key1, self.key2, self.key2, self.key1])
    def test_numeric(self):
        self.provider.paramstyle = 'numeric'
        b = SQLBuilder(self.provider, self.ast)
        self.assertEqual(b.sql, 'SELECT "A"\n'
                                'FROM "T1"\n'
                                'WHERE "B" = :1\n  AND "C" = :2\n  AND "D" = :2\n  AND "E" = :1')
        self.assertEqual(b.layout, [self.key1, self.key2, self.key2, self.key1])
    def test_named(self):
        self.provider.paramstyle = 'named'
        b = SQLBuilder(self.provider, self.ast)
        self.assertEqual(b.sql, 'SELECT "A"\n'
                                'FROM "T1"\n'
                                'WHERE "B" = :p1\n  AND "C" = :p2\n  AND "D" = :p2\n  AND "E" = :p1')
        self.assertEqual(b.layout, [self.key1, self.key2, self.key2, self.key1])
    def test_format(self):
        self.provider.paramstyle = 'format'
        b = SQLBuilder(self.provider, self.ast)
        self.assertEqual(b.sql, 'SELECT "A"\n'
                                'FROM "T1"\n'
                                'WHERE "B" = %s\n  AND "C" = %s\n  AND "D" = %s\n  AND "E" = %s')
        self.assertEqual(b.layout, [self.key1, self.key2, self.key2, self.key1])
    def test_pyformat(self):
        self.provider.paramstyle = 'pyformat'
        b = SQLBuilder(self.provider, self.ast)
        self.assertEqual(b.sql, 'SELECT "A"\n'
                                'FROM "T1"\n'
                                'WHERE "B" = %(p1)s\n  AND "C" = %(p2)s\n  AND "D" = %(p2)s\n  AND "E" = %(p1)s')
        self.assertEqual(b.layout, [self.key1, self.key2, self.key2, self.key1])


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