Files
sqlquerybuilder/sqlquerybuilder/tests.py

106 lines
4.2 KiB
Python

#encoding: utf-8
from __future__ import unicode_literals
import unittest
import datetime
from sqlquerybuilder import Q, Queryset, F
class TestSqlBuilder(unittest.TestCase):
def test_q(self):
self.assertEqual(str(Q(a=1)), "(a=1)")
self.assertEqual(str(Q(a=1) & ~Q(b=2)), "((a=1) AND NOT (b=2))")
self.assertEqual(str(Q(nombre="jose")), "(nombre='jose')")
self.assertEqual(str(Q(a__isnull=True)), "(a is NULL)")
self.assertEqual(str(Q(a__isnull=False)), "(a is NOT NULL)")
self.assertEqual(str(Q(a__startswith="a")), "(a LIKE BINARY 'a%')")
self.assertEqual(str(Q(a__istartswith="a")), "(a LIKE 'a%')")
self.assertEqual(str(Q(a__endswith="a")), "(a LIKE BINARY '%a')")
self.assertEqual(str(Q(a__iendswith="a")), "(a LIKE '%a')")
self.assertEqual(str(Q(a__contains="a")), "(a LIKE BINARY '%a%')")
self.assertEqual(str(Q(a__icontains="a")), "(a LIKE '%a%')")
def test_dates(self):
date = datetime.date(2010, 1, 15)
self.assertEqual(str(Q(fecha=date)), "(fecha='2010-01-15')")
date = datetime.datetime(2010, 1, 15, 23, 59, 38)
self.assertEqual(str(Q(fecha=date)), "(fecha='2010-01-15 23:59:38')")
self.assertEqual(str(Q(fecha__year__lte=2012)), "(DATEPART(year, fecha)<=2012)")
self.assertEqual(str(Q(fecha__year=2012)), "(DATEPART(year, fecha)=2012)")
def test_limits(self):
self.assertEqual(Queryset("table")[:10].get_limits(), "LIMIT 10")
self.assertEqual(Queryset("table")[1:10].get_limits(), "LIMIT 9 OFFSET 1")
def test_compound(self):
qs = Queryset("users", "SQL_SERVER")\
.filter(nombre="jose")\
.order_by("nombre", "-fecha")\
.filter(fecha__lte=F("now()"))[:10]
self.assertEqual(
str(qs), "SELECT TOP 10 * FROM users WHERE ((nombre='jose') AND (fecha<=now())) ORDER BY nombre, fecha DESC")
qs = Queryset("users")\
.filter(nombre="jose")\
.order_by( "nombre", "-fecha")\
.filter(fecha__lte=F("now()"))[:10]
self.assertEqual(
str(qs), "SELECT * FROM users WHERE ((nombre='jose') AND (fecha<=now())) ORDER BY nombre, fecha DESC LIMIT 10")
def test_vars(self):
sql = Queryset("users")
sql = sql.filter(name="jhon")
sql = sql.exclude(date__year__lte=1977)
sql = sql.values("name", "date")
self.assertEqual(
str(sql), "SELECT name, date FROM users WHERE ((name='jhon') AND NOT (DATEPART(year, date)<=1977))")
sql = sql.values("name", "date", "tlf")
sql.filter(name="not")
sql.filter(name="not")
self.assertEqual(
str(sql), "SELECT name, date, tlf FROM users WHERE ((name='jhon') AND NOT (DATEPART(year, date)<=1977))")
def test_extra(self):
sql = Queryset("users").values("name", "date", "tlf")
sql = sql.extra({'select': 'count(*) as total'})
self.assertEqual(
str(sql), "SELECT name, date, tlf, count(*) as total FROM users")
sql = Queryset("users")
sql = sql.extra(where=["id=1", "name='jose'"])
sql = sql.extra(select="count(*) as total")
self.assertEqual(
str(sql), "SELECT *, count(*) as total FROM users WHERE id=1 AND name='jose'")
sql = sql.values(*[])
self.assertEqual(
str(sql), "SELECT count(*) as total FROM users WHERE id=1 AND name='jose'")
def test_in(self,):
sql = Queryset("users")
sql = sql.filter(name__in=["jose", "andres"])
self.assertEqual(
str(sql), "SELECT * FROM users WHERE (name in ('jose', 'andres'))")
sql = Queryset("users")
sql = sql.filter(year__in=[2012, 2014, "Jose"])
self.assertEqual(str(sql), "SELECT * FROM users WHERE (year in (2012, 2014, 'Jose'))")
user = Queryset("users").filter(id=100).values("id")
self.assertEqual(str(user), "SELECT id FROM users WHERE (id=100)")
invoices = Queryset("invoices").filter(user_id__in=user)
self.assertEqual(
str(invoices), "SELECT * FROM invoices WHERE (user_id in (SELECT id FROM users WHERE (id=100)))")
if __name__ == '__main__':
unittest.main()